加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

写给 PHP 措施员的信号处理赏罚教程

发布时间:2019-01-17 23:48:16 所属栏目:移动互联 来源:zhjx922
导读:本日晚上吃卤煮,领桌的妹子问我,这玩意儿能吃么?我:你认为能吃就能吃。。。和内容无关的主题 01 什么是信号 信号就是变乱产生时,对历程的一种关照机制(也叫软件间断)。当一个历程收到信号后,内核会停息该历程正在执行的代码,并跳转到对应的信号处

“ 本日晚上吃卤煮,领桌的妹子问我,这玩意儿能吃么?我:你认为能吃就能吃。。。和内容无关的主题 ”

01

什么是信号

信号就是变乱产生时,对历程的一种关照机制(也叫软件间断)。当一个历程收到信号后,内核会停息该历程正在执行的代码,并跳转到对应的信号处理赏罚函数中,假如处理赏罚函数不间断,执行完处理赏罚函数后,会继承执行之前间断的处所往下执行。

我们在FPM模式下写代码,不会碰着信号处理赏罚相干的题目,可是CLI模式下一些常驻内存的剧本,怎样可以或许自由的重启、封锁、退出前做一些整理事变(断开链接,删除姑且文件等)?

02

C的信号处理赏罚举例

写给 PHP 措施员的信号处理赏罚教程

上图中,我为信号SIGINT注册了处理赏罚函数sigint_handle,捕捉到信号后,输出内容退却出,简朴易懂吧。执行  gcc -o run run.c && ./run ,然后 CTRL+C(会触发SIGINT信号) ,乐成输出: 乐成捕捉到信号2! ,措施直接竣事运行。

03

PHP的信号处理赏罚举例

写给 PHP 措施员的信号处理赏罚教程

pcntl_signal是PHP的信号处理赏罚注册要领,上面实现的成果和C实现的根基同等,差异的是,当前历程不会退出,而且多输出了一个signinfo(PHP是C写的,为啥方才C说话的没有信号相干的信息呢?由于PHP行使的是另一个信号函数 sigaction, 有乐趣的可以相识一下 )

04

PHP的信号处理赏罚并不是直接挪用C

写给 PHP 措施员的信号处理赏罚教程

这个是pcntl初始化的时辰,将pcntl_signal_dispatch注册为tick的处理赏罚函数

写给 PHP 措施员的信号处理赏罚教程

pcntl_signal会将处理赏罚函数放到信号荟萃中(PHP的hash table),而php_signale4最终会挪用sigaction举办底层的信号打点。

写给 PHP 措施员的信号处理赏罚教程

这里我省略了大量代码,将要害的点标志了出来,着实PHP维护一个本身的信号荟萃,每当挪用 pcntl_signal_dispatch时就会查询是否有信号,上面的SIG_BLOCK会将信号阻塞,这样只有我们把要害的代码执行完毕之后,再去触发信号处理赏罚函数以担保数据和措施逻辑的完备性。

05

PHP怎样优雅的处理赏罚信号

常常见到身边的措施员们,每当必要重启PHP-FPM历程的时辰,行使的招数是kill掉全部PHP历程,然后新启动。一样平常环境没啥题目,但有些时辰也许某个历程的使命还没执行完,直接把人家间断了略显粗暴。着实只要你给PHP的Master历程发送一条USR2信号,它便会再处理赏罚完全部使命后,重启子历程,这才是所谓的优雅~

写给 PHP 措施员的信号处理赏罚教程

上图是我简朴写的一个例子,假如我们想让历程优雅退出的时辰,只必要发送SIGTERM信号即可。必要留意的是SIGKILL和SIGSTOP信号会略过信号阻塞会将历程直接遏制,尚有就是信号会间断就寝(SLEEP),sleep假如没执行完会返回剩下的秒数,有乐趣可以试试。

信号相干的常识点着实有许多,还必要继承深入研究~上文中的PHP源码为7.1.25版本,各个版本也许不太一样,假如认为学到了点啥,随手点个悦目

【编辑保举】

  1. 好措施员不写代码?网友:没须要一再发现轮子
  2. @措施员,写代码真的比女伴侣重要吗?
  3. 措施员扛过严冬,必然要看12月的这十篇热点文章
  4. 37岁码农现身说法:大龄措施员谋事变
  5. “严冬”已至,年薪百万的措施员沦为流离汉_技能栈微信半月刊第32期
【责任编辑:张燕妮 TEL:(010)68476606】
点赞 0

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读