2017-02-28 8 views
0

나는 Laravel 5.3 명령에 대한 다음 (단순) 잠금 코드가 있습니다정리 콘솔 명령

private $hash = null; 
public final function handle() { 
    try { 
     $this->hash = md5(serialize([ static::class, $this->arguments(), $this->options() ])); 
     $this->info("Generated signature ".$this->hash,"v"); 

     if (Redis::exists($this->hash)) { 
      $this->hash = null; 
      throw new \Exception("Method ".$this->signature." is already running"); 
     }    
     Redis::set($this->hash, true);          
     $this->info("Running method","vv"); 
     $this->runMutuallyExclusiveCommand(); //Actual command is not important here 
     $this->cleanup(); 
    } catch (\Exception $e) { 
     $this->error($e->getMessage()); 
    } 
} 

public function cleanup() { 
    if (is_string($this->hash)) { 
     Redis::del($this->hash); 
    } 
} 

명령이 일반적으로 그것의 실행주기를 통과 할 수있는 경우이 잘 작동 (처리 할 때 포함을 PHP 예외가 있습니다.) 그러나 명령이 다른 수단 (예 : CTRL-C 또는 터미널 창이 닫힌 경우)을 통해 중단되면 문제가 발생합니다. 이 경우 정리 코드가 실행되지 않고 명령이 여전히 "실행 중"으로 간주되어 캐시를 다시 시작하려면 캐시에서 항목을 수동으로 제거해야합니다. __destruct 함수에서 cleanup 코드를 실행하려고했지만 그 중 하나가 호출되지 않는 것 같습니다.

제 질문은 어떻게 종료되었는지에 관계없이 명령이 종료 될 때 실행할 코드를 설정하는 방법입니까?

답변

1

짧은 대답은 아니오입니다. Ctrl-C 또는 터미널을 닫는 중 실행중인 프로세스를 종료하면 종료됩니다. 쉘에서 클린업 코드로 연결되는 인터럽트가 필요하지만 범위를 벗어난다.

그러나 다른 옵션이 있습니다. Cron 작업은 간헐적 인 간격으로 실행되어 정리 작업 및 기타 유용한 작업을 수행 할 수 있습니다. 현재 코드보다 먼저 실행되는 시작 루틴을 작성할 수도 있습니다. 시작 루틴을 실행할 때 정리 작업을 수행 한 다음 현재 루틴을 호출 할 수 있습니다. 최선의 방법은 단순히 주어진 간격으로 실행되는 cron 작업을 사용하여 캐시에서 더 이상 적절하지 않은 항목을 찾은 다음 정리하는 것입니다. 여기에 cron 작업을 시작하기에 알맞은 사이트가 있습니다. https://www.linux.com/learn/scheduling-magic-intro-cron-linux

+0

작업이 종료되었거나 작업이 여전히 실행 중이기 때문에 캐시 항목이 있는지 여부를 알 수 없기 때문에 cron이 적절하다고 생각하지 않습니다. . 그러나 나는 그 대답이 정말로 '아니오'라는 것을 기꺼이 인정할 것이다. – apokryfos