美工统筹SEO,为企业电子商务营销助力!
PHP历程通讯根本之旌旗灯号一佰互联网站扶植(www.taishanly.com) 宣布时辰:2020-04-26 09:02:38 阅读数: 104 |
操纵旌旗灯号通讯。能够操纵kill -l 来查抄以后体系的旌旗灯号范例。 每一个旌旗灯号所代表的的具体寄义,请查抄我的这篇文章://www.taishanly.com/article/106040.htm 操纵旌旗灯号的时辰能够经由进程php --version 来查抄以后PHP的版本。已决议操纵哪一种体例来停止历程间的旌旗灯号通讯。 [root@roverliang ipc]# php --versionPHP 5.6.24 (cli) (built: Aug 15 2016 19:14:02)Copyright (c) 1997-2016 The PHP GroupZend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies 操纵pcntl_signal_dispatch 函数 须要PHP 版本(PHP 5 >= 5.3.0, PHP 7) 若是PHP版本小于5.3.一些至公司能够会低于这个版本。这个时辰会操纵 declare(ticks=1),意义为每履行一条初级指令, 就会去检测是不是呈现该旌旗灯号。具体的先容能够查抄 //www.taishanly.com/article/48340.htm 官网诠释以下:Tick(时钟周期)是一个在 declare 代码段中诠释器每履行 N 条可计时的初级语句就会产生的事务。N 的值是在 declare 中的 directive 局部用 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、旌旗灯号监听或散发,呈现旌旗灯号挪用已装置的旌旗灯号。 懂得好下面的旌旗灯号概念,咱们来看一个demo: <?php$parentpid = posix_getpid();echo "parent progress pid:{$parentpid}";//界说一个旌旗灯号处置函数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; |
TAG标签: PHP历程通讯根本之旌旗灯号 |
上一篇:PHP历程通讯根本之旌旗灯号量与同享内存通讯 下一篇: PHP 旌旗灯号办理常识清算汇总 |
[前往消息列表] |