PHP进程信号处理

  php有一组进程控制函数PCNTL,使得php能在*nix系统中实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。

注意:pcntl这个扩展仅在cli/cgi模式下可用。mod_php和php-fpm中不可以使用。在web server环境中不要使用这组函数,因为会导致不可预料的结果。另,windows作为非类unix系统,没有这些函数。

ticks

  PCNTL 使用ticks来作为信号处理机制(signal handle callback mechanism),可以最小程度地降低处理异步事件时的负载。何谓ticks?Tick 是一个在代码段中解释器每执行 N 条低级语句就会发生的事件,这个代码段需要通过declare来指定。

下面是一个隔5秒发送一个SIGALRM信号,并由signal_handler函数获取,然后打印一个“SIGALRM”的例子:

<?php
declare(ticks = 1); function signal_handler($signal) {
echo "SIGALRM".date("Y-m-d H:i:s",time()).PHP_EOL;
pcntl_alarm(5);
} //安装闹钟信号触发器
pcntl_signal(SIGALRM, "signal_handler", true);
pcntl_alarm(5); //5秒后向进程发送一个SIGALRM信号 while(true){ } ?>

  其实官方的pcntl_signal性能极差,主要是PHP的函数无法直接注册到操作系统信号设置中,所以pcntl信号需要依赖tick机制来完成。 pcntl_signal的实现原理是,触发信号后先将信号加入一个队列中。然后在PHP的ticks回调函数中不断检查是否有信号,如果有信号就执行PHP中指定的回调函数,如果没有则跳出函数。 ticks=1表示每执行1行PHP代码就回调此函数。实际上大部分时间都没有信号产生,但ticks的函数一直会执行。 比较好的做法是去掉ticks,转而使用pcntl_signal_dispatch,在代码循环中自行处理信号。

pcntl_signal_dispatch

最新文章

  1. 深入学习jQuery选择器系列第五篇——过滤选择器之内容选择器
  2. golang开发环境配置及Beego框架安装
  3. Java集合框架知识总结
  4. Android开发-略讲adb命令和SQLite数据库运用
  5. linux服务之httpd
  6. C#下的Redis 学习
  7. sql server 数据页缓冲区的内存瓶颈分析
  8. 支持多浏览器的镜像反转css效果
  9. js 的基础知识变量
  10. iOS-UITableCell详情
  11. 【语法】修饰符 static extern const
  12. datatables行编辑中,某个字段用户显示和用于行编辑名称不同时的处理。
  13. NEED TO DO
  14. 使用Elasticsearch-dump迁移ES数据
  15. 10树莓派Samba的安装与配置
  16. 25.Odoo产品分析 (三) – 人力资源板块(6) – 工资表(1)
  17. 转://Oracle中User和Schema的区别和联系
  18. Redis学习之SDS源码分析
  19. ajax请求的完整步骤
  20. 第二节 java流程控制(循环结构)

热门文章

  1. JAVA线程及简单同步实现的原理解析
  2. 分布式系统关注点(15)——「水平&amp;垂直切分」详解
  3. 利用ATiny85制作BadUSB
  4. ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露
  5. es6学习笔记-class之继承
  6. SQLSERVER数据库死锁与优化杂谈
  7. 关于JAVA中Byte类型的取值范围的推论(*零为正数,-128在计算机中的表示方法...)
  8. springcloud和springboot是什么关系?
  9. MongoDB分片群集的部署(用心描述,详细易懂)!!
  10. 20190402-display展现、float浮动