PHP 5.6에서 데몬을 작성하고 있습니다. 지금까지 무한 루프가있는 mainLoop()
메서드를 사용하는 기본적으로 Daemon
클래스입니다. 각 반복에서 mainLoop은 일련의 단계를 실행합니다.PHP 5.6 신호 처리 : declare (ticks = 1) vs pcntl_signal_dispatch()
"우아한 kill"메커니즘을 구현하려면 SIGINT 나 SIGTERM이 도착하면 데몬이 죽기 전에 현재 반복의 현재 단계를 완료해야합니다.
제 아이디어는 정적 변수 Daemon::CONTINUE
을 기본값으로 사용하는 것입니다. SIGINT 또는 SIGTERM이 도착하면 FALSE로 설정됩니다. 각 반복에서 다음 단계로 넘어 가기 전에 디먼은 self::CONTINUE
이 FALSE로 전환되었는지 점검하고, 리턴하면 리턴합니다.
이 방법은 pcntl_signal
을 사용하는 것입니다. 그것은 내가 declare(ticks=1)
또는 pcntl_signal_dispatch()
와 함께 사용할 수있는 것으로 보이지만 차이점에 대해서는 잘 모르겠습니다.
은 각 틱 이후에 신호가 도착하는지 프로세스가 확인하지만, pcntl_signal_dispatch()
은 신호를 호출 할 때만 신호를 명시 적으로 검사합니다.
이들은 앞에서 설명한 두 가지 방법 중 일부입니다. 둘 다 맞습니까? 어느 것을 사용해야합니까?
방법 1 개
<?php
declare(ticks=1) {
pcntl_signal(SIGINT, function($signo) {Daemon::CONTINUE = FALSE;});
pcntl_signal(SIGTERM, function($signo) {Daemon::CONTINUE = FALSE;});
}
public class Daemon {
public static $CONTINUE = TRUE;
function mainLoop() {
...
if (self::CONTINUE === FALSE)
return;
...
}
}
방법 지원 2 개
<?php
pcntl_signal(SIGINT, function($signo) {Daemon::CONTINUE = FALSE;});
pcntl_signal(SIGTERM, function($signo) {Daemon::CONTINUE = FALSE;});
public class Daemon {
public static $CONTINUE = TRUE;
function mainLoop() {
...
pcntl_signal_dispatch();
if (self::CONTINUE === FALSE)
return;
...
}
}
감사합니다.