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 文件上传源码分析(RFC1867)
Oct 30 PHP
PHP 获取目录下的图片并随机显示的代码
Dec 28 PHP
php代码收集表单内容并写入文件的代码
Jan 29 PHP
解析PHP中$_FILES的使用以及注意事项
Jul 05 PHP
php用正则表达式匹配中文实例详解
Nov 06 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
ThinkPHP实现二级循环读取的方法
Nov 03 PHP
基于ThinkPHP实现的日历功能实例详解
Apr 15 PHP
laravel手动创建数组分页的实现代码
Jun 07 PHP
php中的explode()函数实例介绍
Jan 18 PHP
PHP封装的简单连接MongoDB类示例
Feb 13 PHP
Laravel框架源码解析之模型Model原理与用法解析
May 14 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判断正常访问和外部访问的示例
2014/02/10 PHP
关于php支持分块与断点续传文件下载功能代码
2014/05/09 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
JavaScript中OnLoad几种使用方法
2012/12/15 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
2016/04/29 Javascript
jQuery为动态生成的select元素添加事件的方法
2016/08/29 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
2017/05/25 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
2019/01/23 Javascript
Vue中的情侣属性$dispatch和$broadcast详解
2019/03/07 Javascript
JS如何在数组指定位置插入元素
2020/03/10 Javascript
在SAE上部署Python的Django框架的一些问题汇总
2015/05/30 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
pycharm安装及如何导入numpy
2020/04/03 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
DTD的含义以及作用
2014/01/26 面试题
自我推荐书
2013/12/04 职场文书
融资租赁计划书
2014/04/29 职场文书
投标承诺书怎么写
2014/05/24 职场文书
自动化专业毕业生求职信
2014/06/18 职场文书
房产协议书范本2014
2014/09/30 职场文书
县级领导干部开展党的群众路线教育实践活动工作汇报
2014/10/25 职场文书
关于感谢信的范文
2015/01/23 职场文书
2015年超市员工工作总结
2015/05/04 职场文书
终止合同协议书范本
2016/03/22 职场文书
如何制定一份可行的计划!
2019/06/21 职场文书