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实现ping
Oct 09 PHP
PHP个人网站架设连环讲(三)
Oct 09 PHP
认识并使用PHP超级全局变量
Jan 26 PHP
php删除文件夹及其文件夹下所有文件的函数代码
Jan 23 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
Jun 13 PHP
php使用curl发送json格式数据实例
Dec 17 PHP
PHP防止刷新重复提交页面的示例代码
Nov 11 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
Sep 15 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
Nov 21 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
Sep 17 PHP
PHP7 windows支持
Mar 09 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脚本的10个技巧(3)
2006/10/09 PHP
PHP+javascript液晶时钟
2006/10/09 PHP
php生成图形验证码几种方法小结
2013/08/15 PHP
PHP利用str_replace防注入的方法
2013/11/10 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
PHP实现的简单适配器模式示例
2017/06/22 PHP
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
js控制web打印(局部打印)方法整理
2013/05/29 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
2016/10/09 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
Python中字符串对齐方法介绍
2015/05/21 Python
TensorFlow安装及jupyter notebook配置方法
2017/09/08 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
2017/10/07 Python
Python编程求质数实例代码
2018/01/31 Python
Python退火算法在高次方程的应用
2018/07/26 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
如何在Django中设置定时任务的方法示例
2019/01/18 Python
python如何操作mysql
2020/08/17 Python
CSS3实现10种Loading效果
2016/07/11 HTML / CSS
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
婚庆公司的创业计划书
2014/01/22 职场文书
质量承诺书格式
2014/05/20 职场文书
兵马俑的导游词
2015/02/02 职场文书
学生乘坐校车安全责任书
2015/05/11 职场文书
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js