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 相关文章推荐
VIM中设置php自动缩进为4个空格的方法详解
Jun 14 PHP
PHP利用REFERER根居访问来地址进行页面跳转
Sep 28 PHP
php中ftp_chdir与ftp_cdup函数用法
Nov 18 PHP
php获取文章上一页与下一页的方法
Dec 01 PHP
PHP设计模式之适配器模式代码实例
May 11 PHP
php判断表是否存在的方法
Jun 18 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
Aug 31 PHP
深入理解PHP变量的值类型和引用类型
Oct 21 PHP
详解php设置session(过期、失效、有效期)
Nov 12 PHP
PHP读取PPT文件的方法
Dec 10 PHP
php执行多个存储过程的方法【基于thinkPHP】
Nov 08 PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 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
咖啡知识 咖啡养豆要养多久 排气又是什么
2021/03/06 新手入门
人大复印资料处理程序_输入篇
2006/10/09 PHP
discuz Passport 通行证 整合笔记
2008/06/30 PHP
php管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
js弹窗返回值详解(window.open方式)
2014/01/11 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
2014/05/11 Javascript
js实现简单鼠标跟随效果的方法
2015/04/10 Javascript
js实现页面跳转的几种方法小结
2016/05/16 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
Angular2 组件交互实例详解
2017/08/24 Javascript
用Webpack构建Vue项目的实践
2017/11/07 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
Python正则表达式经典入门教程
2017/05/22 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
opencv python 2D直方图的示例代码
2018/07/20 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
学习Python爬虫的几点建议
2020/08/05 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
奇怪的鱼:Weird Fish
2018/03/18 全球购物
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
大学生的创业计划书就该这么写
2014/01/30 职场文书
责任书格式范文
2014/07/28 职场文书
人大调研汇报材料
2014/08/14 职场文书
庆元旦演讲稿
2014/09/15 职场文书
实习生矿工检讨书
2014/10/13 职场文书
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫