이 글은 PHP 프로세스 통신의 기본 중 신호에 대한 기본 지식과 예제를 주로 소개합니다. 도움이 필요한 친구들은
신호 통신 사용을 참고할 수 있습니다. kill -l을 사용하여 현재 시스템의 신호 유형을 볼 수 있습니다.
각 시그널의 자세한 의미는 제 글을 확인해주세요: http://www.jb51.net/article/106040.htm
시그널을 사용할 때, php --version Version을 통해 현재 PHP를 확인할 수 있습니다. 프로세스 간 신호 통신에 어떤 방법을 사용할지 결정되었습니다.
[root@roverliang ipc]# php --version PHP 5.6.24 (cli) (built: Aug 15 2016 19:14:02) Copyright (c) 1997-2016 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
pcntl_signal_dispatch 기능을 사용하려면 PHP 버전(PHP 5 >= 5.3.0, PHP 7)이 필요합니다.
PHP 버전이 5.3 미만인 경우 일부 대기업에서는 이 버전보다 낮을 수 있습니다. 이때 선언(ticks=1)이 사용됩니다. 즉, 하위 수준 명령어가 실행될 때마다
가 신호 발생 여부를 감지한다는 의미입니다. 자세한 소개는 http://www.jb51.net/article/48340.htm
을 확인하세요. 공식 홈페이지에서는 다음과 같이 설명하고 있습니다. Tick(시계 주기)은 인터프리터가 N개의 하위 수준 명령문을 실행할 때마다 타이머입니다. 발생하는 선언 코드 세그먼트 이벤트에서 시간을 정할 수 있습니다. N 값은 선언의 지시문 부분에서 Ticks=N으로 지정됩니다.
저수준 명령문이란 무엇입니까? 다음 코드에 표시된 대로:
for ($i = 0; $i < 3; $i++) { echo $i.PHP_EOL; }
이 for 루프에는 세 가지 저수준 명령어가 포함되어 있습니다. $i가 출력될 때마다. 등록된 이벤트가 발생했는지 여부를 감지합니다. 짐작할 수 있듯이 이 효율성은 상대적으로 낮습니다. 따라서 귀하의 PHP가 5.3 이상인 것으로 감지되면. 신호 전달을 위해 pcntl_singal_dispath를 사용하십시오.
메인 프로세스는 시작될 때 일부 신호 처리 기능을 등록합니다.
/** * @param $signal 信号 */ function signalHandal($signal) { switch ($signal) { case SIGINT: //do something break; case SIGHUP: //do something break; default : //do something break; } }
그런 다음 신호 프로세서를 신호 처리 함수에 바인딩합니다.
//根据不同的信号,安装不同的信号处理器 pcntl_signal(SIGINT, 'signalHandal'); pcntl_signal(SIGHUP, 'signalHandal'); pcntl_signal(SIGUSR1, 'signalHandla');
자식 프로세스의 신호를 듣고 신호가 발생하면 사전 설치된 신호 처리 함수를 호출합니다.
//分配信号。 pcntl_signal_dispatch($signal);
아이디어 정리하기:
1. 신호가 발생할 때 이벤트를 처리해야 하는 함수를 정의합니다.
2. 신호 설치라고 하는 신호 처리 기능을 바인딩합니다.
3. 신호 모니터링 또는 분배, 신호가 나타나면 설치된 신호를 호출합니다.
위의 신호 개념을 이해하고 데모를 살펴보겠습니다.
<?php $parentpid = posix_getpid(); echo "parent progress pid:{$parentpid}\n"; //定义一个信号处理函数 function sighandler($signal) { if ($signal == SIGINT) { $pid = getmypid(); exit("{$pid} process, Killed!".PHP_EOL); } } //php version < 5.3 .每执行一条低级指令,就检查一次是否出现该信号。效率损耗很大。 //declare(ticks=1); $child_list = []; //注册一个信号处理器。当发出该信号的时候对调用已定义的函数 pcntl_signal(SIGINT, 'sighandler'); for($i = 0; $i < 3; $i++) { $pid = pcntl_fork(); if ($pid == 0) { //子进程 while (true) { //调用已安装的信号信号处理器,为了检测是否有新的信号等待dispatching pcntl_signal_dispatch(); echo "I am child: ".getmypid(). " and i am running !".PHP_EOL; sleep(rand(1,3)); } } elseif($pid > 0) { $child_list[] = $pid; } else { die('fork fail!'.PHP_EOL); } } sleep(5); foreach ($child_list as $key => $pid) { posix_kill($pid, SIGINT); } sleep(2); echo "{$parentpid} parent is end".PHP_EOL;
위는 이 기사의 전체 내용입니다. 모든 사람의 학습에 도움이 되기를 바랍니다.
관련 권장 사항:
PHP 공유 메모리 사용량 및 signal제어 예제 분석
matplotlib Python을 기반으로 한 시간 도메인 파형 및 정현파 signal의 스펙트로그램 예제 구현
위 내용은 PHP 프로세스 통신을 기반으로 한 신호에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!