> 백엔드 개발 > PHP 튜토리얼 > PHP 프로그래머를 위한 신호 처리

PHP 프로그래머를 위한 신호 처리

藏色散人
풀어 주다: 2023-04-09 18:06:02
앞으로
3273명이 탐색했습니다.

PHP 프로그래머를 위한 신호 처리 튜토리얼

오늘 밤에 돼지고기 조림을 먹고 있는데 테이블에 앉은 여자가 나에게 '이 음식은 먹을 수 있나요?'라고 물었습니다. 나: 먹을 수 있을 것 같으면 먹어도 돼요. . . 콘텐츠와 관련 없는 주제

신호란 무엇입니까

신호는 이벤트가 발생할 때 프로세스에 대한 알림 메커니즘(소프트웨어 인터럽트라고도 함)입니다. 프로세스가 신호를 받으면 커널은 프로세스에 의해 실행 중인 코드를 일시 중지하고 해당 신호 처리 기능으로 점프합니다. 처리 기능이 중단되지 않으면 처리 기능이 실행된 후 중단된 곳에서 실행이 계속됩니다. 구현하다.

FPM 모드에서 코드를 작성하면 신호 처리와 관련된 문제가 발생하지 않습니다. 그러나 CLI 모드의 일부 메모리 상주 스크립트의 경우 종료하기 전에 어떻게 자유롭게 다시 시작하고 닫고 정리 작업을 수행할 수 있습니까? 임시 파일 등을 삭제하시겠습니까?

C 신호 처리 예시

PHP 프로그래머를 위한 신호 처리

위 그림에서는 SIGINT 신호에 대한 처리 함수 sigint_handle를 등록했습니다. 간단하고 이해하기 쉬운 콘텐츠 종료. gcc -o run run.c && ./run을 실행한 다음 CTRL+C(SIGINT 신호가 트리거됨)를 실행하면 성공적으로 출력됩니다. : 신호 2가 성공적으로 캡처되었습니다!, 프로그램이 즉시 종료됩니다. SIGINT注册了处理函数sigint_handle,捕获到信号后,输出内容后退出,简单易懂吧。执行 gcc -o run run.c && ./run ,然后CTRL+C(会触发SIGINT信号),成功输出:成功捕获到信号2!,程序直接结束运行。

PHP的信号处理举例

PHP 프로그래머를 위한 신호 처리

pcntl_signal是PHP的信号处理注册方法,上面实现的功能和C实现的基本一致,不同的是,当前进程不会退出,并且多输出了一个signinfo(PHP是C写的,为啥刚刚C语言的没有信号相关的信息呢?因为PHP使用的是另一个信号函数sigaction,有兴趣的可以了解一下)

PHP的信号处理并不是直接调用C

PHP 프로그래머를 위한 신호 처리

这个是pcntl初始化的时候,将pcntl_signal_dispatch注册为tick的处理函数

PHP 프로그래머를 위한 신호 처리

pcntl_signal会将处理函数放到信号集合中(PHP的hash table),而php_signale4最终会调用sigaction进行底层的信号管理。

PHP 프로그래머를 위한 신호 처리

这里我省略了大量代码,将关键的点标记了出来,其实PHP维护一个自己的信号集合,每当调用pcntl_signal_dispatch时就会查询是否有信号,上面的SIG_BLOCK会将信号阻塞,这样只有我们把关键的代码执行完毕之后,再去触发信号处理函数以保证数据和程序逻辑的完整性。

PHP如何优雅的处理信号

经常见到身边的程序员们,每当需要重启PHP-FPM进程的时候,使用的招数是kill掉所有PHP进程,然后新启动。一般情况没啥问题,但有些时候可能某个进程的任务还没执行完,直接把人家中断了略显粗暴。其实只要你给PHP的Master进程发送一条USR2信号,它便会再处理完所有任务后,重启子进程,这才是所谓的优雅~

PHP 프로그래머를 위한 신호 처리

上图是我简单写的一个例子,如果我们想让进程优雅退出的时候,只需要发送SIGTERM信号即可。需要注意的是SIGKILLSIGSTOP信号会略过信号阻塞会将进程直接停止,还有就是信号会中断睡眠(SLEEP),sleep

PHP 신호 처리 예제

66d0037ff6798e2f06 5605e8a17d80b .png🎜🎜🎜pcntl_signal은 PHP의 신호처리 등록 방식입니다. 위에서 구현한 함수는 기본적으로 C에서 구현한 함수와 동일합니다. 차이점은 현재 프로세스가 종료되지 않고, signinfo를 하나 더 출력합니다. (PHP는 C로 작성되었는데 왜 지금 C언어에는 시그널 관련 정보가 없나요? PHP는 또 다른 시그널 함수인 sigaction을 사용하기 때문에, 관심 있는 분은 자세히 알아보세요)🎜🎜PHP의 신호 처리는 C🎜🎜PHP 프로그래머를 위한 신호 처리🎜🎜pcntl 초기화 시 틱 처리 함수로 pcntl_signal_dispatch를 등록합니다🎜🎜PHP 프로그래머를 위한 신호 처리🎜🎜pcntl_signal에 처리 기능을 넣습니다. 속으로 신호 수집(PHP의 해시 테이블) 및 php_signale4는 결국 기본 신호 관리를 위해 sigaction을 호출합니다. 🎜🎜PHP 프로그래머를 위한 신호 처리🎜🎜여기 많은 코드를 생략하고 핵심 사항을 표시했습니다. 실제로 PHP는 자체 신호 수집을 유지합니다. pcntl_signal_dispatch가 호출될 때마다 위의 SIG_BLOCK이 있는지 쿼리합니다. code>는 키 코드 실행을 마친 후에만 신호 처리 기능을 트리거하여 데이터 및 프로그램 논리의 무결성을 보장할 수 있도록 신호를 차단합니다. 🎜🎜PHP가 신호를 우아하게 처리하는 방법🎜🎜주변에서 <code>PHP-FPM 프로세스를 다시 시작해야 할 때마다 모든 PHP 프로세스를 종료하고 새 프로세스를 시작하는 프로그래머를 자주 봅니다. . 일반적으로는 문제가 없으나 때로는 특정 프로세스의 작업이 완료되지 않을 수 있으며, 이를 직접 방해하는 것은 다소 무례한 일이 될 수 있습니다. 실제로 PHP 마스터 프로세스에 USR2 신호를 보내기만 하면 모든 작업이 완료되고 하위 프로세스가 다시 시작됩니다. 이것이 소위 우아함입니다~🎜🎜541FC1FC34BABFE57D6666790F55 .png 是 위 사진은 제가 간단하게 쓴 예시입니다 , 프로세스를 정상적으로 종료하려면 SIGTERM 신호만 보내면 됩니다. SIGKILLSIGSTOP 신호는 신호 차단을 건너뛰고 프로세스를 직접 중지하며 신호는 절전(SLEEP), sleep실행이 완료되지 않으면 남은 초가 반환됩니다. 관심이 있으시면 시도해 볼 수 있습니다. 🎜🎜실제로 신호와 관련된 지식 포인트가 많고, 계속 깊이 있게 공부해야 합니다~ 위의 PHP 소스 코드는 7.1.25 버전이며, 버전마다 다를 수 있습니다. 🎜🎜

위 내용은 PHP 프로그래머를 위한 신호 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿