写给 PHP 措施员的信号处理赏罚教程
“ 本日晚上吃卤煮,领桌的妹子问我,这玩意儿能吃么?我:你认为能吃就能吃。。。和内容无关的主题 ” 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版本,各个版本也许不太一样,假如认为学到了点啥,随手点个悦目 【编辑保举】
点赞 0 (编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |