SIGTERM POSIX 시그널 처리 > PHP
PHP

SIGTERM POSIX 시그널 처리

조회 102회 댓글 0건

PHP에서는 pcntl_signal 함수를 사용하여 특정 시그널을 처리할 수 있습니다.
pcntl_signal 함수를 사용하면 PHP 스크립트 안에서 시그널 핸들러를 등록할 수 있습니다.
이 함수는 POSIX 시그널을 처리하는 데 사용되며, PHP가 CLI(명령줄 인터페이스) 모드에서 동작할 때만 사용할 수 있습니다.

아래는 SIGTERM 시그널을 처리하는 예제
declare(ticks = 1); 이전에 사용하던 방식으로 라인마다 시그널이 있는지 감지하는 기능이다. 최근에는 비동기적으로 pcntl_async_signals를 사용한 아래쪽 프로그램을 참고하면 된다.


  declare(ticks = 1);

  // SIGTERM 시그널 핸들러 정의
  // 쉘에서 -9 옵션으로 kill 하면 여기 들어오지 않고 바로 죽는다: 죽었음
  function sig_handler($signo)
  {
    switch ($signo) {
      // 여기에 SIGTERM 시그널을 받았을 때의 처리를 구현.
      case SIGTERM:
        echo "signo: $signo / SIGTERM received\n";
        exit;
        break;

      // 다른 시그널에 대한 처리
      default:
        echo 'signo: ' . $signo . PHP_EOL;
    }
  }

  // SIGTERM 시그널 핸들러 등록
  pcntl_signal(SIGTERM, "sig_handler");

  // 무한 루프를 돌면서 시그널을 기다립니다.
  while (true) {
    sleep(1);
  }
  exit;
 


위 코드에서 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` 함수를 사용하여 비동기적으로 시그널을 처리하는 예제는 아래와 같다.


  // 비동기 시그널 처리 활성화
  pcntl_async_signals(true);

  // SIGTERM 시그널 핸들러 정의
  function sig_handler($signo)
  {
    switch ($signo) {
      // 여기에 SIGTERM 시그널을 받았을 때의 처리를 구현.
      case SIGTERM:
        echo "signo: $signo / SIGTERM received ";
        exit;
        break;

      // 다른 시그널에 대한 처리
      default:  
    }
    }

  // SIGTERM 시그널 핸들러 등록
  pcntl_signal(SIGTERM, "sig_handler");

  // 무한 루프를 돌면서 시그널을 기다립니다.
  while (true) {
    sleep(1);
  }
 


이 예제는 이전의 declare(ticks=1); 예제와 비슷하지만,
pcntl_async_signals(true);를 호출하여 비동기 시그널 처리를 활성화하는 점이 다르다.
이 함수를 호출하면 시그널이 도착하자마자 즉시 처리됩니다.

따라서 이 스크립트는 SIGTERM 시그널을 받으면 "SIGTERM received"라는 메시지를 출력하고 종료합니다.
이러한 방식으로 PHP에서 시그널 처리를 구현할 수 있다.

  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
전체 195건 1 페이지
  • profile_image 제가 만든것은 아니고 테스트 한것을 정리하여 올린 것입니다. 음력 -> 양력으로 변경하는 라이브러리 흔하고 간단할줄 알았는데 생각외로 복잡하고 제대로 되는것을 찾기도 쉽지 않았습니다.여기선 PHP 8.1에서 테스트 한것입니다. PHP8 부터는 isset 같은것을 사용해야 되는 부분만 참고하면 되고 깃허브에 있는 예제가 모두 실행 되는것은 아니었습니다. 제가 필요한 음력, 양력으로 변경하는 부분이 문제가 없었습니다.만세력의 문제점등 라이센스…
  • profile_image 앞으로 @ 사용하지 말라고 하니 새로 만드는 프로그램은 try-catch 감싸서 처리 하는 것이 좋다.그래서 필요한 것으로 아래를 참고하면 된다. 그리고 아래 복원하는 함수면 한 줄이기 때문에 함수가 왜? 필요할까 싶지만 이런 경우도 함수로 만들어 사용하면 후에 어려운 일이 발생 했을 때 해결 할 수 있는 좋은 일이 생기게 되기도 한다.  # 사용자 오류처리기   convertErrorsToExceptions();   #   try {    $…
  • profile_image 내장함수에 strip_tags 라는 것이 있습니다.HTML을 삭제하고 txt만 남기죠. 그리고 나서 공백이 2개 이상이거나 줄바꿈이 필요 없거나 탭 같은것은 별도 삭제를 해줘야 합니다. 여기서 다루는 함수는 자바스크립트등 몇가지를 더 삭제해 주는 기능입니다.결과 확인 후 본인에게 맞지 않으면 좀 더 추가 해야 될 수 있는데 요즘은 GPT4 이용하면 도움이 많이 됩니다.  /**   * html2txt    *    * @param mixed $…
  • profile_image 사이트의 페이지를 소켓방식으로 수집할때 많이 사용하는 curl 클래스 입니다.본인의 상황에 따라서 좀더 조건을 줘서 처리를 하면 되며 쿠키를 저장해서 다시 보내줘야 한 다면 이 부분에 대한 주석 처리 된것을 풀어서 테스트 해보면 됩니다.중요한것은 HTTP 프로토콜에 대한 명확한 이해가 가장 중요합니다.원리를 모르는 상태에서 사용을 하다보면 헛발질을 많이 할 수 밖에 없기 때문이죠~코딩을 잘 한다는 것은 깔끔하게 재사용가능하게 하는 것도 중요하지…
  • profile_image AWS SES API를 활용하면서 PEAR 라이브러리 활용할 필요가 있을 때 사용하면 되지만 일반적으로는 사용할 필요는 없습니다.하지만 필요한 분이 있을 수 있어 예전 소스중에 있어 올립니다. 1) PEAR 설치 사용하는 PHP 버전의 경로를 지정해서 설치 해야 한다. wget https://pear.php.net/go-pear.phar /usr/local/php82/bin/php go-pear.phar /usr/local/php82/bin/p…
  • profile_image AWS에서 메일을 발송하는 방법에는 SMTP 설정을 통한 방법이 있고 다른 하나는 API를 이용한 방법이 있는데여기에선 API를 이용한 방법에 대한 예 입니다.보통 간단하게 조금 보낼때는 관계 없는데 많이 보내게 되면 AWS 비용이 비싸고 반송 메일에 따라 좋지 않으면 패널티도 받기 때문에 AWS 이용은 많이 안하는 편입니다.대량메일 발송서비스만 전문으로 해주는곳을 이용하거나 직접 구축하여 발송을 하게 됩니다.한달 몇 천건 정도면 이것 이용해도…
  • profile_image 간혹 PHP만 설치해서 사용하고 최대한 라이브러리 설치 하지 않게 사용하면서 간단하게 암호화할 필요가 있을 경우 사용 합니다. 가능하면 OpenSSL 라이브러리 사용하는 암호화 방식을 추천 합니다.  그리고 어떤 방식이든 대칭형 암호화에서 키는 가능하면 길게 만들고 여기선 md5 사용 했지만 sha512 같은것 사용하면 더 좋고 시간, 또는 일마다 같은 문자도 암호화 결과가 다르게 만드는것이 좋습니다. 그 부분은 개인의 상황에 맞게 별도의 메소…