PHP进程通信基础之信号


Posted in PHP onFebruary 19, 2017

使用信号通信。可以使用kill -l 来查看当前系统的信号类型。
每个信号所代表的的详细含义,请查看我的这篇文章:https://3water.com/article/106040.htm
使用信号的时候可以通过php --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.一些大公司可能会低于这个版本。这个时候会使用 declare(ticks=1),意思为每执行一条低级指令,
就会去检测是否出现该信号。详细的介绍可以查看 https://3water.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}\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 相关文章推荐
PHP中创建并处理图象
Oct 09 PHP
PHP计划任务之关闭浏览器后仍然继续执行的函数
Jul 22 PHP
php SQL Injection with MySQL
Feb 27 PHP
PHP写杨辉三角实例代码
Jul 17 PHP
xss防御之php利用httponly防xss攻击
Mar 21 PHP
又一个PHP实现的冒泡排序算法分享
Aug 21 PHP
推荐十款免费 WordPress 插件
Mar 24 PHP
php上传文件并显示上传进度的方法
Mar 24 PHP
CodeIgniter钩子用法实例详解
Jan 20 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
Mar 18 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
Jun 16 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 PHP
PHP 信号管理知识整理汇总
Feb 19 #PHP
php 三大特点:封装,继承,多态
Feb 19 #PHP
PHP实现大数(浮点数)取余的方法
Feb 18 #PHP
Zend Framework基于Command命令行建立ZF项目的方法
Feb 18 #PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
Feb 18 #PHP
Zend Framework数据库操作技巧总结
Feb 18 #PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
Feb 18 #PHP
You might like
php添加文章时生成静态HTML文章的实现代码
2013/02/17 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
微信自定义分享php代码分析
2016/11/24 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
Autocomplete Textbox Example javascript实现自动完成成功
2007/08/17 Javascript
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
JavaScript实现公历转农历功能示例
2017/02/13 Javascript
详解plotly.js 绘图库入门使用教程
2018/02/23 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
python3图片文件批量重命名处理
2019/10/31 Python
python实现手势识别的示例(入门)
2020/04/15 Python
python删除某个目录文件夹的方法
2020/05/26 Python
python中判断文件结束符的具体方法
2020/08/04 Python
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
Javascript如何发送一个Ajax请求
2015/01/26 面试题
北京某科技有限公司C# .net笔试题
2014/09/27 面试题
海量信息软件测试笔试题
2015/08/08 面试题
冰淇淋开店创业计划书
2014/02/01 职场文书
经理任命书模板
2014/06/06 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
电信营业员岗位职责
2015/04/14 职场文书
工作时间调整通知
2015/04/24 职场文书
公司车队管理制度
2015/08/04 职场文书
Redis IP地址的绑定的实现
2021/05/08 Redis