使用puphpeteer时Chrome僵尸进程过多,求排查思路
Puphpeteer 僵尸Chrome进程排查方案
检查资源释放逻辑
- 确认代码中是否显式调用浏览器关闭方法:必须执行
$browser->close(),同时确保页面实例$page也调用$page->close()。僵尸进程核心原因是父进程未回收子进程资源,PHP若未触发Node侧的资源销毁,Chrome进程就会残留。 - 排查异常分支:如果获取iframe时抛出错误,需在
finally块中强制执行浏览器关闭,避免异常导致资源释放代码未执行。
- 确认代码中是否显式调用浏览器关闭方法:必须执行
验证Rialto-PHP的进程管理
- 检查Node进程状态:执行
ps aux | grep node,观察每次调用后Node进程是否也变为僵尸。若Node正常退出但Chrome未被回收,说明Rialto未正确向Puppeteer发送关闭信号。 - 尝试更新Rialto到最新可用版本(虽已废弃,但部分修复分支仍可使用),或指定Rialto启动Node的参数,确保它能正确处理子进程退出逻辑。
- 检查Node进程状态:执行
调整Chrome启动参数
- 添加
--single-process参数测试:该参数会让Chrome以单进程模式运行(性能略有下降),可快速判断是否为多进程模式下的回收问题。若单进程无僵尸,说明多进程的父进程回收逻辑存在异常。 - 补充
--disable-dev-shm-usage参数:部分环境下/dev/shm空间不足会导致进程异常退出并变为僵尸,添加该参数可规避此问题。
- 添加
对比原生Puppeteer行为
- 将业务逻辑转为JS版本(使用Puppeteer 20 + Node 16.20环境),执行后观察是否出现僵尸进程。若原生环境无问题,说明故障出在Puphpeteer/Rialto的PHP-Node通信层;若原生也存在僵尸,需排查Chrome版本或系统进程回收机制(如系统进程表异常)。
系统层面排查
- 检查PHP进程管理模式:若使用FPM,查看FPM子进程是否在请求结束后正常回收。若FPM进程未正确退出,其下属的Chrome进程会变为僵尸。
- 使用
strace跟踪PHP进程:观察调用结束时是否发送SIGCHLD信号回收子进程,或检查Chrome进程的父ID(PPID)是否变为1(init进程)。若PPID为1但仍为僵尸,可能是系统进程表存在异常。
内容的提问来源于stack exchange,提问作者SirLouen
相关产品推荐
相关产品推荐

