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下利用header()函数设置浏览器缓存的代码
Sep 01 PHP
php图片上传存储源码并且可以预览
Aug 26 PHP
php上传文件,创建递归目录的实例代码
Oct 18 PHP
页面利用渐进式JPEG来提升用户体验度
Dec 01 PHP
php支付宝接口用法分析
Jan 04 PHP
CI框架整合widget(页面格局)的方法
May 17 PHP
中高级PHP程序员应该掌握哪些技术?
Sep 23 PHP
php基于单例模式封装mysql类完整实例
Oct 18 PHP
php微信开发之图片回复功能
Jun 14 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
Jan 28 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
Sep 16 PHP
php将xml转化对象的实例详解
Nov 17 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
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
超级简单的发送邮件程序
2006/10/09 PHP
详解PHP中的null合并运算符
2015/12/30 PHP
PHP优化之批量操作MySQL实例分析
2020/04/23 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
简单通用的JS滑动门代码
2008/12/19 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
javascript作用域问题实例分析
2015/07/13 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
jquery 手势密码插件
2017/03/17 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
js布局实现单选按钮控件
2020/01/17 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
python 实现红包随机生成算法的简单实例
2017/01/04 Python
单利模式及python实现方式详解
2018/03/20 Python
python简单贪吃蛇开发
2019/01/28 Python
django框架模板中定义变量(set variable in django template)的方法分析
2019/06/24 Python
python日期相关操作实例小结
2019/06/24 Python
Django单元测试工具test client使用详解
2019/08/02 Python
详解python如何引用包package
2020/06/07 Python
HTML5 Canvas实现放大镜效果示例
2020/03/25 HTML / CSS
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
UDP协议功能
2013/01/06 面试题
Java语言的优势
2015/01/10 面试题
8和9的加减法教学反思
2014/05/01 职场文书
公共场所标语
2014/06/30 职场文书
移交协议书
2014/08/19 职场文书
2014全年工作总结
2014/11/27 职场文书
2015年学校德育工作总结
2015/04/22 职场文书
家长必看:义务教育,不得以面试 评测等名义选拔学生
2019/07/09 职场文书