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;

    }

}

 

 

 

 

 

 

 

 

 

 

Posted by bloodguy
,