PHP信号处理机制的操作代码讲解


Posted in PHP onApril 19, 2019

我们首先来看下实例代码:

function sig_handler($sig)

{

  print("handled sig: $sig\n");

}

 

 

 

pcntl_signal(SIGIO,  "sig_handler");

posix_kill(posix_getpid(),SIGIO);

 

while(true)

{

  posix_kill(posix_getpid(),SIGIO);

 

  pcntl_signal_dispatch();

 

  sleep(1);

}

最好自己手动循环处理信号队列,而不是使用php提供的的declare(ticks=1),tick_handler()这种信号处理机制,因为tick机制的性能问题,每执行一条语句都回调tick_handler查看是否有信号,而很大部分时间是没有信号的。

posix_signal设置信号的回调处理,

posix_kill仅仅是把信号放入进程的信号待处理队列中,所有并不会触发信号回调,由pcntl_signal_dispatch处理信号队列中的信号

posix_getpwnam("nginx"):获取用户名的uid,gid等信息

pcntl_signal(SIGPIPE, SIG_IGN, false):忽略内核发来的SIGPIPE信号,当连接已closed,进程继续发数据到无效socket,系统会收到含RST 控制位TCP包,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。该信号的默认处理是终止进程,进程可以捕获它并忽略该信号以免不情愿的被终止。

socket上下文选项:

backlog:用于限制流监听队列中未完成连接的连接数量

so_reuseport:重用端口(由内核调度连接到多个监听同一个端口的进程,由于是通过hash方式来标志连接对应的进程,所以监听进程数是不能改变的,)

定时器信号处理

pcntl_signal(SIGALRM,"sig_handler");

pcntl_alarm(2);

function sig_handler($sig)

{

  echo "one second after";

}

while (1)

{

  pcntl_signal_dispatch();

  sleep(1);

}
PHP 相关文章推荐
模拟SQLSERVER的两个函数:dateadd(),datediff()
Oct 09 PHP
PHP开启gzip页面压缩实例代码
Mar 11 PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
PHP写杨辉三角实例代码
Jul 17 PHP
for循环连续求和、九九乘法表代码
Feb 20 PHP
zf框架的数据库追踪器使用示例
Mar 13 PHP
在win7中搭建Linux+PHP 开发环境
Oct 08 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
Nov 29 PHP
php实现过滤字符串中的中文和数字实例
Jul 29 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
Feb 23 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 PHP
PHP常量及变量区别原理详解
Aug 14 PHP
CentOS7编译安装php7.1的教程详解
Apr 18 #PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
Apr 17 #PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
Apr 17 #PHP
Laravel5框架自定义错误页面配置操作示例
Apr 17 #PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
Apr 16 #PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
Apr 16 #PHP
Laravel中9个不经常用的小技巧汇总
Apr 16 #PHP
You might like
提升PHP执行速度全攻略(下)
2006/10/09 PHP
PHP执行zip与rar解压缩方法实现代码
2010/12/05 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
使用Modello编写JavaScript类
2006/12/22 Javascript
基于jQuery的倒计时实现代码
2012/05/30 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
jQuery与JS加载事件用法分析
2016/09/04 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
学习React中ref的两个demo示例
2018/08/14 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
js模拟实现百度搜索
2020/06/28 Javascript
[02:38]2018年度DOTA2最佳劣单位选手-完美盛典
2018/12/17 DOTA
python生成器generator用法实例分析
2015/06/04 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
Python 列表去重去除空字符的例子
2019/07/20 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
全神贯注教学反思
2014/02/03 职场文书
优秀团支部事迹材料
2014/02/08 职场文书
工地安全质量标语
2014/06/07 职场文书
安全生产工作汇报
2014/10/28 职场文书
店面出租协议书范本
2014/11/28 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
服务器间如何实现文件共享
2022/05/20 Servers
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL