ToB企服应用市场:ToB评测及商务社交产业平台

标题: 深入明白 PHP 高性能框架 Workerman 保卫进程原理 [打印本页]

作者: 瑞星    时间: 2024-8-12 09:29
标题: 深入明白 PHP 高性能框架 Workerman 保卫进程原理
各人好,我是码农先森。
保卫进程顾名思义就是能够在后台一直运行的进程,不会霸占用户的会话终端,脱离了终端的控制。相信朋侪们对这东西都不生疏了吧?假如连这个概念都还不能明白的话,建议回炉重造多看看 Linux 进程管理相关的基础知识。在我们一样平常的编程中常见有类似 php think ...、php artisan ...、php yii ... 等命令启动需要一直实验的使命,都会通过 nohup 挂载到后台保持长期运行的状态。同样在 Workerman 中也是利用类似 php index.php start 的命令来启动进程,但不同的是它不需要利用 nohup 便可以挂载到后台运行。那有些朋侪就会好奇它是怎么实现的呢?为了办理朋侪们的疑惑,我们今天就重点深入分析一下 Workerman 保卫进程的实现原理。
我们先相识一些进程相关的知识:
这些概念俗称八股文,向来都不怎么好明白,那我们来看个例子。实验了命令 php index.php 便产生了进程 61052「该进程的父进程是 Bash 进程 8243,这里不用管它」,然后通过 Fork 创建了子进程 61053 且其父进程就是 61052,这两个进程拥有共同的进程组 61052 和会话 8243。调用 posix_setsid 函数,将会为子进程 61053 开启新的进程组 61053 和新的会话 61053,这里的会话可以明白为一个新的命令窗口终端。最后子进程 61053 通过 Fork 创建了子进程 61054,进程 61053 升级成了父进程,这里再次 Fork 的缘故原由是要避免被终端控制进程所关联,这个进程 61052 是在终端的模式下创建的,自此进程 61054 就形成了保卫进程。
  1. [manongsen@root phpwork]$ php index.php
  2. [parent] 进程ID: 61052, 父进程ID: 8243, 进程组ID: 61052, 会话ID: 8243
  3. [parent1] 进程ID: 61052, 父进程ID: 8243, 进程组ID: 61052, 会话ID: 8243 退出了该进程
  4. [child1] 进程ID: 61053, 父进程ID: 61052, 进程组ID: 61052, 会话ID: 8243
  5. [child1] 进程ID: 61053, 父进程ID: 61052, 进程组ID: 61053, 会话ID: 61053
  6. [parent2] 进程ID: 61053, 父进程ID: 61052, 进程组ID: 61053, 会话ID: 61053 退出了该进程
  7. [child2] 进程ID: 61054, 父进程ID: 61053, 进程组ID: 61053, 会话ID: 61053 保留了该进程
  8. [manongsen@root phpwork]$ ps aux | grep index.php
  9. root             66064   0.0  0.0 408105040   1472 s080  S+   10:00下午   0:00.00 grep index.php
  10. root             61054   0.0  0.0 438073488    280   ??  S    10:00下午   0:00.00 php index.php
复制代码
上面举例的进程信息,正是这段代码运行所产生的。假如看了这段代码且细心的朋侪,会发现为什么 posix_setsid 这个函数不放在第一次 Fork 前调用,而在第二次 Fork 前调用呢,这样的话就不用 Fork 两次了?缘故原由是组长进程是不能创建会话的,进程组ID 61052 和进程ID 61052 相同「即当前进程则为组长进程」,所以需要子进程来创建新的会话,这一点需要特殊注意一下。
[code]




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4