2014-07-18 1 views
0

PHP CLI 스크립트가 멈추는 지 감지 할 수 있습니까? 이것은 Ctrl + C을 사용하여 스크립트를 종료하거나 스크립트가 자연스럽게 종료되는지 여부를 확인해야합니다. 이상하게도 스크립트가 완전히 정지되기 전에 어떤 종류의 콜백을 찾아야합니다. 테스트는 스크립트가 자연스럽게 종료 할 때, 그것은 경우에 대한 트리거하지 않습니다 불 것으로 보였다, 그러나PHP CLI 스크립트가 스크립트에서 콜백을 감지/발동 할 수 있습니까?

<?php 

class ExitHandler { 
    public function __destruct() { 
     toOut('Script Halted'); // Writes to STDOUT 
    } 
} 

$exitHandler = new ExitHandler(); 

// ... 

?> 

: 나는 다음과 같은 __destruct() 기능을 하나의 클래스를 가질 수있는

내 원래 생각 스크립트는 Ctrl 키 + C으로 중단되었다

php -r "Class Abc { public function __destruct() { echo 'Bye.'; } } $x = new Abc();" 
=>Bye. 

php -r "Class Abc { public function __destruct() { echo 'Bye.'; } } $x = new Abc(); while(true) { sleep(1); fwrite(STDOUT, 'Tick'); }" 
=>TickTickTick^C 

답변

1

내가 믿는 pcntl_signal w

<?php 
// tick use required as of PHP 4.3.0 
declare(ticks = 1); 

// signal handler function 
function sig_handler($signo) 
{ 

    switch ($signo) { 
     case SIGTERM: 
      // handle shutdown tasks 
      exit; 
      break; 
     case SIGHUP: 
      // handle restart tasks 
      break; 
     case SIGUSR1: 
      echo "Caught SIGUSR1...\n"; 
      break; 
     default: 
      // handle all other signals 
    } 

} 

echo "Installing signal handler...\n"; 

// setup signal handlers 
pcntl_signal(SIGTERM, "sig_handler"); 
pcntl_signal(SIGHUP, "sig_handler"); 
pcntl_signal(SIGUSR1, "sig_handler"); 

// or use an object, available as of PHP 4.3.0 
// pcntl_signal(SIGUSR1, array($obj, "do_something")); 

echo"Generating signal SIGTERM to self...\n"; 

// send SIGUSR1 to current process id 
posix_kill(posix_getpid(), SIGUSR1); 

echo "Done\n"; 

?> 
: 아픈 당신이 정기적으로 처리하기 위해 (비 죽일 -9) 링크 위에서 촬영 종료

예를 허용

관련 문제