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 程序授权验证开发思路
Jul 09 PHP
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
Dec 16 PHP
关于js与php互相传值的介绍
Jun 25 PHP
CI(CodeIgniter)框架介绍
Jun 09 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
Aug 21 PHP
php插入排序法实现数组排序实例
Feb 16 PHP
PHP实现动态web服务器方法
Jul 29 PHP
php如何计算两坐标点之间的距离
Dec 29 PHP
php生成word并下载代码实例
Mar 15 PHP
PHP设计模式之简单工厂和工厂模式实例分析
Mar 25 PHP
php根据地址获取百度地图经纬度的实例方法
Sep 03 PHP
PHP7新特性
Mar 09 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语法(4)
2006/10/09 PHP
图解找出PHP配置文件php.ini的路径的方法
2014/08/20 PHP
php生成QRcode实例
2014/09/22 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
php微信公众平台示例代码分析(二)
2016/12/06 PHP
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
jQuery动画效果实现图片无缝连续滚动
2016/01/12 Javascript
运用js教你轻松制作html音乐播放器
2020/04/17 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
从setTimeout看js函数执行过程
2017/12/19 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
Django验证码的生成与使用示例
2017/05/20 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
2020/04/24 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
html5实现微信打飞机游戏
2014/03/27 HTML / CSS
医药代表个人求职信范本
2013/12/19 职场文书
自行车租赁公司创业计划书
2014/01/28 职场文书
幼儿园运动会加油词
2014/02/14 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
反四风个人对照检查材料思想汇报
2014/09/25 职场文书
小学教师师德整改措施
2014/09/29 职场文书
2019个人工作总结
2019/06/21 职场文书
Python Django模型详解
2021/10/05 Python
windows11怎么查看wifi密码? win11查看wifi密码的技巧
2021/11/21 数码科技
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL