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 error_log 函数的使用
Apr 13 PHP
PHP 配置文件中open_basedir选项作用
Jul 19 PHP
php set_time_limit(0) 设置程序执行时间的函数
May 26 PHP
基于python发送邮件的乱码问题的解决办法
Apr 25 PHP
PHP在线生成二维码(google api)的实现代码详解
Jun 04 PHP
6种php上传图片重命名的方法实例
Nov 04 PHP
浅析Yii2集成富文本编辑器redactor实例教程
Apr 25 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
Apr 18 PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 27 PHP
Thinkphp5框架使用validate实现验证功能的方法
Aug 27 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
Apr 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
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
PHP的一个基础知识 表单提交
2011/07/04 PHP
php文件怎么打开 如何执行php文件
2011/12/21 PHP
ThinkPHP的Widget扩展实例
2014/06/19 PHP
php获取apk包信息的方法
2014/08/15 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
(function(){})()的用法与优点
2007/03/11 Javascript
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
2013/12/18 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
深入分析javascript中console命令
2016/08/14 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
vue视频播放暂停代码
2019/11/08 Javascript
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
python 将数据保存为excel的xls格式(实例讲解)
2018/05/03 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
windows下python 3.6.4安装配置图文教程
2018/08/21 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
HTML5移动开发图片压缩上传功能
2016/11/09 HTML / CSS
应届大学毕业生找工作的求职信范文
2013/11/29 职场文书
心理健康教育制度
2014/01/27 职场文书
材料加工工程求职信
2014/02/19 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
初中英语演讲稿
2014/04/29 职场文书
航空学院求职信
2014/06/11 职场文书
写给老师的感谢信
2015/01/20 职场文书
幼儿园父亲节活动总结
2015/02/12 职场文书
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript
vue中div禁止点击事件的实现
2022/04/02 Vue.js
Java实现注册登录跳转
2022/06/16 Java/Android
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python