【深入workerman的信号机制】研究下PCNTL扩展源码

phpcreeper
【1】深入workerman信号机制

这个话题是本人《深入PHP内核源码》视频教程里的一个插录环节,剖析扩展源码的细节移步B站

【2】研究背景

workerman内核实现有依赖PCNTL扩展,这是因为涉及到信号编程,其中局部依赖了pcntl_signal()pcntl_signal_dispatch() 这两个函数,至今社区对这个话题的讨论热度依旧不减,但是这种机制有个缺陷:性能倒不低,主要是需要用户空间不断的轮询,所以PHP7.1+高版本提供了新的机制:即异步处理信号的函数pcntl_async_signals(), 我们感兴趣的是这三个函数在底层到底是怎么工作的? 为了揭开其背后的的工作真相,所以很有必要研究一下其对应的C源码实现,这有助于我们进行科学的信号编程,也有助于理解workerman的相关实现细节。

【3】分析手段
  • 先一行一行的剖析其C源码实现。
  • 本人对源码进行了微小改动,仅用于基础调试。
  • 最后再用GDB跟踪调试一遍。
【4】得出结论
  • pcntl_signal:只是安装了(PHP上层空间)信号处理器,仅此而已。
    注意:当且仅当接收到信号时(由PHP内核空间的信号处理器)将信号拦截入队。
  • pcntl_signal_dispatch:
    (PHP上层空间)信号处理器不会自动执行,必须手动调用本函数以处理待决信号。
  • 异步处理信号机制:完全是由PHP内核来监管的,触发时机发生在执行栈切换瞬间。
  • 该扩展一定程度上解决了(非可靠)信号丢失的问题,至少目前研究的版本并没有彻底解决。
1499 2 2
2个评论

liziyu

大佬辛苦了,受教了。

  • 暂无评论
Tinywan

赞!

  • 暂无评论
年代过于久远,无法发表评论

phpcreeper

11886
积分
0
获赞数
0
粉丝数
2015-11-07 加入
×
🔝