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 nl2br()格式化输出的详解
Jun 05 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
php绘制一个扇形的方法
Jan 24 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
Dec 18 PHP
php打包压缩文件之ZipArchive方法用法分析
Apr 30 PHP
joomla组件开发入门教程
May 04 PHP
smarty自定义函数用法示例
May 20 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
Feb 08 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
Jun 06 PHP
thinkPHP框架实现生成条形码的方法示例
Jun 06 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
Mar 06 PHP
PHP自动载入类文件函数__autoload的使用方法
Mar 25 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 Session及如何保持其不过期的方法
2015/08/18 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
个人总结的一些关于String、Function、Array的属性和用法
2007/01/10 Javascript
Prototype Number对象 学习
2009/07/19 Javascript
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
JavaScript中的Array对象使用说明
2011/01/17 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
简单的JS轮播图代码
2016/07/18 Javascript
基于JavaScript实现活动倒计时效果
2017/04/20 Javascript
详解express与koa中间件模式对比
2017/08/07 Javascript
基于vue组件实现猜数字游戏
2020/05/28 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
redux.js详解及基本使用
2019/05/24 Javascript
详解vue父子组件关于模态框状态的绑定方案
2019/06/05 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
javascript实现随机抽奖功能
2020/12/30 Javascript
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
更新pip3与pyttsx3文字语音转换的实现方法
2019/08/08 Python
Python如何优雅获取本机IP方法
2019/11/10 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
HTML5实现应用程序缓存(Application Cache)
2020/06/16 HTML / CSS
澳大利亚领先的在线礼品网站:Gifts Australia
2020/08/15 全球购物
酒店管理自荐信
2013/10/23 职场文书
应届生自我鉴定
2013/12/11 职场文书
新闻学专业个人求职信写作
2014/02/04 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis