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 相关文章推荐
利用static实现表格的颜色隔行显示
Oct 09 PHP
php 获取全局变量的代码
Apr 21 PHP
PHP5常用函数列表(分享)
Jun 07 PHP
如何使用php输出时间格式
Aug 31 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
Jan 04 PHP
php实现以只读方式打开文件的方法
Mar 16 PHP
详解PHP中的PDO类
Jul 06 PHP
PHP实现简单搜歌的方法
Jul 28 PHP
thinkPHP中验证码的简单使用方法
Dec 26 PHP
总结PHP删除字符串最后一个字符的三种方法
Aug 30 PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 PHP
php弹出提示框的是实例写法
Sep 26 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 Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
2015/03/19 PHP
php layui实现前端多图上传实例
2019/07/30 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
xtree.js 代码
2007/03/13 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
跟我学习javascript的定时器
2015/11/19 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
Python lambda和Python def区别分析
2014/11/30 Python
Python查询IP地址归属完整代码
2017/06/21 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
python文件及目录操作代码汇总
2020/07/08 Python
Python 处理日期时间的Arrow库使用
2020/08/18 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
海淘零差价,宝贝全球购: 宝贝格子
2016/08/24 全球购物
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
社区两委对照检查材料
2014/08/23 职场文书
辞职信标准格式
2015/02/27 职场文书
个人求职信格式范文
2015/03/20 职场文书
父亲节感言
2015/08/03 职场文书
文明礼貌主题班会
2015/08/14 职场文书
小学教师教学随笔
2015/08/14 职场文书
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL