SIGTERM POSIX 시그널 처리
PHP에서는 pcntl_signal 함수를 사용하여 특정 시그널을 처리할 수 있습니다.
pcntl_signal 함수를 사용하면 PHP 스크립트 안에서 시그널 핸들러를 등록할 수 있습니다.
이 함수는 POSIX 시그널을 처리하는 데 사용되며, PHP가 CLI(명령줄 인터페이스) 모드에서 동작할 때만 사용할 수 있습니다.
아래는 SIGTERM 시그널을 처리하는 예제
declare(ticks = 1); 이전에 사용하던 방식으로 라인마다 시그널이 있는지 감지하는 기능이다. 최근에는 비동기적으로 pcntl_async_signals를 사용한 아래쪽 프로그램을 참고하면 된다.
위 코드에서 sig_handler 함수는 SIGTERM 시그널을 받았을 때 호출되는 함수입니다.
declare(ticks=1);은 PHP에서 제공하는 특별한 구문으로 ticks는 PHP가 실행하는 각 코드 라인마다 시그널 핸들러를 체크하게 만드는 역할을 하는데 declare(ticks=1);은 이 체크를 코드의 각 라인마다 수행하도록 지시하는 것인데 ticks를 사용하면 이러한 시그널 체크를 얼마나 자주 수행할지 결정할 수 있다.
pcntl_signal(SIGTERM, "sig_handler"); 코드를 통해 SIGTERM 시그널이 발생했을 때 sig_handler 함수가 호출되도록 설정.
따라서 이 스크립트는 SIGTERM 시그널을 받으면 "SIGTERM received"라는 메시지를 출력하고 종료합니다.
(쉘에서 kill pid번호 명령을 내려서 테스트 해보면 됩니다.)
이 기능은 PHP가 CLI 모드에서 동작할 때만 사용 가능하고, 웹 서버 환경에서는 당연히 사용할 수 없다. pid에 신호를 보낼 수 없기 때문이다.
웹 서버 환경에서는 웹 서버 자체가 시그널을 처리하므로, PHP 스크립트에서 직접 시그널을 처리하는 것은 불가능하다.
pcntl_async_signals` 함수를 사용하여 비동기적으로 시그널을 처리하는 예제는 아래와 같다.
이 예제는 이전의 declare(ticks=1); 예제와 비슷하지만,
pcntl_async_signals(true);를 호출하여 비동기 시그널 처리를 활성화하는 점이 다르다.
이 함수를 호출하면 시그널이 도착하자마자 즉시 처리됩니다.
따라서 이 스크립트는 SIGTERM 시그널을 받으면 "SIGTERM received"라는 메시지를 출력하고 종료합니다.
이러한 방식으로 PHP에서 시그널 처리를 구현할 수 있다.