PHP로 daemon 을 작성해서 구동하다가 kill을 이용해서 종료하고자 할 때,
작업수행이 완전히 끝나고 나서 종료하기 위해 signal handler를 박아 처리하는 방법.
기존에는 declare(ticks = 1); 을 이용해서 tick 을 낚아채야 가능했으나,
PHP 6.0 부터는 tick이 사라지므로 대신 루프 내부에서 dispatch 를 하는 식으로 변경.
아래 예제는 kill 에 대응되는 SIGTERM 밖에 없지만 필요에 따라 signal handler를 여러 시그널에 박아서 사용할 수 있음.
참조: http://www.php.net/pcntl_signal
<?PHP
// signal handler 연결
pcntl_signal(SIGTERM, 'Terminator::sig_handler');
while (true) {
echo "난 아직 살아있음...\n";
// SIGTERM 체크
pcntl_signal_dispatch(); // signal dispatch
// SIGTERM이 들어왔으면 프로세스 종료
if (Terminator::isNeedDie()) exit;
sleep(1);
}
class Terminator
{
// SIGTERM 상태체크 변수
static private $isSigTerm = false;
// signal handler
static public function sig_handler($sigNo)
{
if ($sigNo == SIGTERM) self::$isSigTerm = true;
}
// SIGTERM이 들어왔는지 체크
static public function isNeedDie()
{
return self::$isSigTerm;
}
}
'PHP' 카테고리의 다른 글
[PHP] OS에 상관없이 load average 가져오기 [OS, Windows, LoadAverage] (0) | 2012.10.16 |
---|---|
[PHP] 날짜 일수 차이 계산 [date_diff(), DateTime, DateInterval] (0) | 2012.10.11 |
[PHP] 지역변수, 클래스 멤버변수에 배열대입시 시간 (local variable, class member) (0) | 2012.09.07 |
[PHP] Jaccard's coefficient를 위한 intersect, union 구하는 방법. (0) | 2012.08.29 |
[PHP] gzdecode() 함수가 없다고 에러 나올 때 (1) | 2012.08.28 |