决台 发表于 2025-6-4 14:18:57

聊聊 PHP 多进程模式下的孤儿进程和僵尸进程

大家好,我是码农先森。
在 PHP 的编程实践中多进程通常都是在 cli 脚本的模式下使用,我依稀还记得在多年以前为了实现从数据库导出千万级别的数据,第一次在 PHP 脚本中采用了多进程编程。在此之前我从未接触过多进程,只知道 PHP-FPM 进程管理器是多进程模型,但从未在编程中进行实践。多进程虽然能带来效率上的提升,但依然会带来不少的问题,如果初学者使用多进程,那注定会遇到各种奇奇怪怪的 Bug 比如并发操作数据库引起死锁、共用内存变量资源造成串数据、忘记回收进程资源导致产生孤儿进程、僵尸进程等。反正如果我们长期都是 PHP-FPM 模式下编程的话,在使用多进程编程时需要慎之又慎,避免出现意想不到的问题。不过这次我想分享的内容是多进程模式下的孤儿进程和僵尸进程,通过示例代码来看看这两者进程是如何产生的,又应该如何解决,内容不难但是在实际的编程中是可能比较容易忽视的点。

按照惯例我们先看看孤儿进程和僵尸进程的基础概念。

[*]孤儿进程:是指一个进程的父进程已经终止,但该子进程仍然在运行。当父进程结束时,操作系统会将其所有的子进程重新分配给 init 进程。init 进程会负责这些孤儿进程,并确保它们能够正确结束。孤儿进程不会造成资源泄漏,因为最终它们会被 init 进程管理并正确清理。
[*]僵尸进程:是指一个已经完成执行的进程,但仍在进程表中保留了一些信息。这通常发生在父进程未调用 wait() 或相关函数来获取子进程的退出状态时。僵尸进程处于 Z 状态,是一种占用系统资源但不占用 CPU 的进程。僵尸进程会继续占用系统的进程 ID,如果大量产生将导致进程 ID 耗尽,可能会影响系统的正常运行。
这两者进程的基础概念应该还比较好理解,孤儿进程的产生就是缘于父进程的不负责,自己先跑路了,导致自己的子进程变成了孤儿,最后孤儿进程被系统给回收了,可以理解为被政府的福利院收养了。僵尸进程的产生就是儿子进程执行完了没有退出,但是父进程又不知情,无法及时回收儿子进程的资源,导致自己的儿子进程变成了僵尸进程,僵尸进程往往比孤儿进程对系统的危害更大,接下来我们来看看具体的代码示例。
首先看看孤儿进程示例,使用 pcntl_fork 函数创建了一个子进程,子进程会每间隔 1 秒钟获取一次自己进程的 ID 和父进程的 ID,而父进程在 2 秒钟之后就退出跑路了,自此子进程就变成了孤儿进程,被系统进程收养了。

颛孙中 发表于 2025-12-23 12:59:13

谢谢楼主提供!

徙办 发表于 2025-12-24 07:28:02

感谢分享,下载保存了,貌似很强大

泻缥 发表于 2026-1-14 22:53:37

不错,里面软件多更新就更好了

谷江雪 发表于 2026-1-16 21:51:11

不错,里面软件多更新就更好了

暴灵珊 发表于 2026-1-20 22:11:10

很好很强大我过来先占个楼 待编辑

笃迩讦 发表于 2026-1-22 20:30:22

过来提前占个楼

玲液 发表于 2026-1-25 16:42:17

这个有用。

郦惠 发表于 2026-1-27 07:27:04

感谢分享

菅舛 发表于 2026-1-28 10:26:09

热心回复!

艾曼语 发表于 2026-1-29 03:59:05

收藏一下   不知道什么时候能用到

柴古香 发表于 2026-2-3 06:26:18

鼓励转贴优秀软件安全工具和文档!

艺轫 发表于 2026-2-3 07:20:16

谢谢分享,试用一下

玲液 发表于 2026-2-5 18:00:37

谢谢分享,辛苦了

吕梓美 发表于 2026-2-6 11:59:10

感谢分享,下载保存了,貌似很强大

崔和美 发表于 2026-2-8 12:30:36

喜欢鼓捣这些软件,现在用得少,谢谢分享!

背竽 发表于 2026-2-9 02:22:37

感谢分享

格恳绌 发表于 2026-2-9 15:19:13

感谢,下载保存了

趣侮 发表于 2026-2-10 05:15:03

谢谢分享,辛苦了

梭净挟 发表于 2026-2-10 06:48:11

这个好,看起来很实用
页: [1] 2
查看完整版本: 聊聊 PHP 多进程模式下的孤儿进程和僵尸进程