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 xfocus防注入资料
Apr 27 PHP
php检测网页是否被百度收录的函数代码
Oct 09 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
Nov 18 PHP
PHP PDO fetch 模式各种参数的输出结果一览
Jan 07 PHP
深入浅出php socket编程
May 13 PHP
PHP获取文件行数的方法
Jun 10 PHP
php 调用ffmpeg获取视频信息的简单实现
Apr 03 PHP
浅谈PHP面向对象之访问者模式+组合模式
May 22 PHP
PHP实现多图上传和单图上传功能
May 17 PHP
PDO::errorCode讲解
Jan 28 PHP
php实现微信和支付宝支付的示例代码
Aug 11 PHP
基于PHP实现邮箱验证激活过程详解
Oct 28 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获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
将string解析为json的几种方式小结
2010/11/11 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
jQuery 全选 全不选 事件绑定的实现代码
2017/01/23 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
Vue代码分割懒加载的实现方法
2017/11/23 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
详解关于webpack多入口热加载很慢的原因
2019/04/24 Javascript
解决layer.confirm快速点击会重复触发事件的问题
2019/09/23 Javascript
Vue 一键清空表单的实现方法
2020/02/07 Javascript
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
谈谈node.js中的模块系统
2020/09/01 Javascript
python 捕获shell脚本的输出结果实例
2017/01/04 Python
python 判断是否为正小数和正整数的实例
2017/07/23 Python
python实现百万答题自动百度搜索答案
2018/01/16 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
中介公司区域经理岗位职责范本
2014/03/02 职场文书
企业新年寄语
2014/04/04 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
公司运动会策划方案
2014/05/25 职场文书
运动员获奖感言
2014/08/15 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
会议简讯范文
2015/07/20 职场文书
Python词云的正确实现方法实例
2021/05/08 Python
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android