<output id="ELkwk"></output><th id="ELkwk"></th>
<button id="ELkwk"><option id="ELkwk"><object id="ELkwk"></object></option><colgroup id="ELkwk"></colgroup></button>

        <area id="ELkwk"></area><select id="ELkwk"><small id="ELkwk"><param id="ELkwk"></param></small></select>
        <del id="ELkwk"></del>
      • <ul id="ELkwk"><rt id="ELkwk"></rt></ul>
        <select id="ELkwk"><col id="ELkwk"></col></select><link id="ELkwk"><li id="ELkwk"><col id="ELkwk"><thead id="ELkwk"></thead></col></li></link>

            1. |
              |
              |
              |
              公众号矩阵

              写给 PHP 程序员的信号处理教程

              信号相关的知识点其实有很多,还需要继续深入研究~上文中的PHP源码为7.1.25版本,各个版本可能不太一样。

              作者: zhjx922来源: 假装是个程序员|2021-04-23 12:46

              “ 今天晚上吃卤煮,领桌的妹子问我,这玩意儿能吃么?我:你觉得能吃就能吃。!:湍谌菸薰氐闹魈 

              01

              什么是信号

              信号就是事件发生时,对进程的一种通知机制(也叫软件中断)。当一个进程收到信号后,内核会暂停该进程正在执行的代码,并跳转到对应的信号处理函数中,如果处理函数不中断,执行完处理函数后,会继续执行之前中断的地方往下执行。

              我们在FPM模式下写代码,不会遇到信号处理相关的问题,但是CLI模式下一些常驻内存的脚本,如何能够自由的重启、关闭、退出前做一些清理工作(断开链接,删除临时文件等)?

              02

              C的信号处理举例

              上图中,我为信号SIGINT注册了处理函数sigint_handle,捕获到信号后,输出内容后退出,简单易懂吧。执行  gcc -o run run.c && ./run ,然后 CTRL+C(会触发SIGINT信号) ,成功输出: 成功捕获到信号2! ,程序直接结束运行。

              03

              PHP的信号处理举例

              pcntl_signal是PHP的信号处理注册方法,上面实现的功能和C实现的基本一致,不同的是,当前进程不会退出,并且多输出了一个signinfo(PHP是C写的,为啥刚刚C语言的没有信号相关的信息呢?因为PHP使用的是另一个信号函数 sigaction, 有兴趣的可以了解一下 )

              04

              PHP的信号处理并不是直接调用C

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

              pcntl_signal会将处理函数放到信号集合中(PHP的hash table),而php_signale4最终会调用sigaction进行底层的信号管理。

              这里我省略了大量代码,将关键的点标记了出来,其实PHP维护一个自己的信号集合,每当调用 pcntl_signal_dispatch时就会查询是否有信号,上面的SIG_BLOCK会将信号阻塞,这样只有我们把关键的代码执行完毕之后,再去触发信号处理函数以保证数据和程序逻辑的完整性。

              05

              PHP如何优雅的处理信号

              经常见到身边的程序员们,每当需要重启PHP-FPM进程的时候,使用的招数是kill掉所有PHP进程,然后新启动。一般情况没啥问题,但有些时候可能某个进程的任务还没执行完,直接把人家中断了略显粗暴。其实只要你给PHP的Master进程发送一条USR2信号,它便会再处理完所有任务后,重启子进程,这才是所谓的优雅~

              上图是我简单写的一个例子,如果我们想让进程优雅退出的时候,只需要发送SIGTERM信号即可。需要注意的是SIGKILL和SIGSTOP信号会略过信号阻塞会将进程直接停止,还有就是信号会中断睡眠(SLEEP),sleep如果没执行完会返回剩下的秒数,有兴趣可以试试。

              信号相关的知识点其实有很多,还需要继续深入研究~上文中的PHP源码为7.1.25版本,各个版本可能不太一样,如果觉得学到了点啥,顺手点个好看

              【编辑推荐】

              1. 好程序员不写代码?网友:没必要重复发明轮子
              2. @程序员,写代码真的比女朋友重要吗?
              3. 程序员扛过寒冬,一定要看12月的这十篇热门文章
              4. 37岁码农现身说法:大龄程序员找工作
              5. “寒冬”已至,年薪百万的程序员沦为流浪汉_技术栈微信半月刊第32期
              【责任编辑:张燕妮 TEL:(010)68476606】

              点赞 0
              分享:
              大家都在看
              猜你喜欢
              24H热文
              一周话题
              本月最赞

              订阅专栏+更多

              活学活用 Ubuntu Server

              活学活用 Ubuntu Server

              实战直通车
              共35章 | UbuntuServer

              216人订阅学习

              Java EE速成指南

              Java EE速成指南

              掌握Java核心
              共30章 | 51CTO王波

              83人订阅学习

              Mysql DBA修炼之路

              Mysql DBA修炼之路

              MySQL入门到高阶
              共24章 | 武凤涛

              468人订阅学习

              读 书 +更多

              网络管理员考前辅导

              本书按照国家人事部、信息产业部全国计算机技术与软件专业资格(水平)考试要求编写,内容紧扣《网络管理员考试大纲》。全书共分为11章,覆...

              订阅51CTO邮刊

              点击这里查看样刊

              订阅51CTO邮刊

              51CTO服务号

              51CTO播客