This article mainly introduces the basic knowledge and examples related to signals in the basics of PHP process communication. It is very good. Friends in need can refer to
Using signal communication. You can use kill -l to view the signal type of the current system.
For the detailed meaning of each signal, please check my article: http://www.jb51.net/article/106040.htm
When using signals, you can use php --version Check the current PHP version. It has been decided which method to use for signal communication between processes.
[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
Using the pcntl_signal_dispatch function requires a PHP version (PHP 5 >= 5.3.0, PHP 7)
If the PHP version Less than 5.3. Some large companies may go lower than this version. At this time, declare(ticks=1) will be used, which means that every time a low-level instruction is executed,
will detect whether the signal occurs. For a detailed introduction, please check http://www.jb51.net/article/48340.htm
The official website explains as follows: Tick (clock cycle) is a timer that can be timed every N items executed by the interpreter in the declare code segment. Events that will occur with low-level statements. The value of N is specified with ticks=N in the directive part of declare.
So what are low-level statements: as shown in the following code:
for ($i = 0; $i < 3; $i++) { echo $i.PHP_EOL; }
Then this for loop contains three low-level instructions. Each time $i is output. It will detect whether a registered event has occurred. As you can imagine, this efficiency is relatively low. So if it is detected that your PHP is greater than or equal to 5.3. Just use pcntl_singal_dispath for signal dispatch.
The main process registers some signal processing functions when it starts.
/** * @param $signal 信号 */ function signalHandal($signal) { switch ($signal) { case SIGINT: //do something break; case SIGHUP: //do something break; default : //do something break; } }
Then bind the signal processor to the signal processing function:
//根据不同的信号,安装不同的信号处理器 pcntl_signal(SIGINT, 'signalHandal'); pcntl_signal(SIGHUP, 'signalHandal'); pcntl_signal(SIGUSR1, 'signalHandla');
Listen to the signal in the child process. If the signal occurs, call the pre-installed signal processing function
//分配信号。 pcntl_signal_dispatch($signal);
Let’s sort out the ideas:
1. Definition The function that needs to handle the event when the signal occurs
2. Bind the signal and the signal processing function, which is called signal installation.
3. Signal monitoring or distribution, when a signal appears, call the installed signal.
After understanding the above signal concept, let’s take a look at a demo:
<?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 shared memory usage and signalsControl example analysis
Based on matplotlib Python to implement time domain waveform and spectrogram examples of sinusoidal signal
PHP processSignalProcessing
The above is the detailed content of Detailed explanation of signals on the basis of PHP process communication. For more information, please follow other related articles on the PHP Chinese website!