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调用数据库的存贮过程!
Oct 09 PHP
网页游戏开发入门教程三(简单程序应用)
Nov 02 PHP
php 常用类整理
Dec 23 PHP
解析Ubuntu下crontab命令的用法
Jun 24 PHP
使用PHP会话(Session)实现用户登陆功能
Jun 29 PHP
Thinkphp实现MySQL读写分离操作示例
Jun 25 PHP
PHP实现懒加载的方法
Mar 07 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
Mar 18 PHP
php判断一个数组是否为有序的方法
Mar 27 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
Mar 14 PHP
PHP迭代与递归实现无限级分类
Aug 28 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
Apr 07 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
Linux Apache PHP Oracle 安装配置(具体操作步骤)
2013/06/17 PHP
php动态生成函数示例
2014/03/21 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
利用PHP命令行模式采集股票趋势信息
2016/08/09 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
JS Date函数整理方便使用
2013/10/23 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
jquery $(&quot;#variable&quot;) 循环改变variable的值示例
2014/02/23 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
JS实现太极旋转思路分析
2016/12/09 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
javascript实现右下角广告框效果
2017/02/01 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
Django中的Model操作表的实现
2018/07/24 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
Python学习笔记之Zip和Enumerate用法实例分析
2019/08/14 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
浅谈django不使用restframework自定义接口与使用的区别
2020/07/15 Python
彻底搞懂python 迭代器和生成器
2020/09/07 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
详解css position 5种不同的值的用法
2019/07/30 HTML / CSS
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
linux面试题参考答案(6)
2016/06/23 面试题
业务员薪酬管理制度
2014/01/15 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
导游词之吉林吉塔
2019/11/11 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL
OpenCV-Python使用cv2实现傅里叶变换
2021/06/09 Python