2017-10-08 20 views
0

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; 
     ... 
    } 
} 

감사합니다.

답변

0

일부 테스트 및 디버깅을 마친 후 두 솔루션을 모두 시도했습니다. 누군가 내 문제가 발생할 경우를 대비하여 본인의 의견을 남겨 둘 것입니다.

선언문 (틱 = 1)이있는 웨이 1이 작동하지 않는 것 같습니다. 이유를 이해할 수 없습니다.
반대로 pcntl_signal_dispatch()가있는 way 2 인 것이 좋을 것 같습니다.

깊은 연구 끝에, 어쨌든 2가 내 사건에 가장 좋은 방법이라고 생각합니다.
사실, declare (tick = 1)은 각 코드 라인의 실행에 대략 일치하는 각 tick마다 pcntl_signal을 실행합니다. 이것은 잠재적으로 성능을 저하시킬 수 있습니다.

반대로 pcntl_signal_dispatch는 호출 될 때 보류중인 신호를 처리하기 때문에 성능면에서 더 가볍습니다.