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 相关文章推荐
数据库的日期格式转换
Oct 09 PHP
完美解决PHP中文乱码
Nov 26 PHP
php将数据库中所有内容生成静态html文档的代码
Apr 12 PHP
php中3种方法统计字符串中每种字符的个数并排序
Aug 27 PHP
解析PHP实现下载文件的两种方法
Jul 05 PHP
php将图片保存为不同尺寸图片的图片类实例
Mar 30 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
PHP读取文件内容的五种方式
Dec 28 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
PHP 计算两个特别大的整数实例代码
May 07 PHP
利用PHP扩展Xhprof分析项目性能实践教程
Sep 05 PHP
php获取小程序码的实现代码(B类接口)
Jun 13 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
海贼王动画变成“真人”后,凯多神还原,雷利太帅了!
2020/04/09 日漫
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
2009/08/07 PHP
drupal 代码实现URL重写
2011/05/04 PHP
PHP filter_var() 函数 Filter 函数
2012/04/25 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
2016/12/12 PHP
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
onmouseover和onmouseout的一些问题思考
2013/08/14 Javascript
JS正则表达式大全(整理详细且实用)
2013/11/14 Javascript
JQuery+Ajax无刷新分页的实例代码
2014/02/08 Javascript
Javascript动画的实现原理浅析
2015/03/02 Javascript
详解AngularJS中的依赖注入机制
2015/06/17 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
jquery插件ajaxupload实现文件上传操作
2015/12/09 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
webpack4实现不同的导出类型
2019/04/09 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
2020/01/14 Javascript
js中调用微信的扫描二维码功能的实现代码
2020/04/11 Javascript
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
eclipse创建python项目步骤详解
2019/05/10 Python
python使用opencv在Windows下调用摄像头实现解析
2019/11/26 Python
pandas创建DataFrame的7种方法小结
2020/06/14 Python
武汉东之林科技有限公司机试
2013/09/17 面试题
Java如何读取CLOB字段
2013/10/10 面试题
新学期校长寄语
2014/01/18 职场文书
公司离职证明标准样本
2014/10/05 职场文书
2014年车间主任工作总结
2014/12/10 职场文书
2014小学年度工作总结
2014/12/20 职场文书
Go 在 MongoDB 中常用查询与修改的操作
2021/05/07 Golang
教你怎么用Python生成九宫格照片
2021/05/20 Python