在 PHP-FPM 的池配置文件(通常是 www.conf)中将 catch_workers_output 设置为 yes,即可将 worker 进程的标准输出和错误重定向到主错误日志。该设置适用于调试丢失的报错信息,但在高流量生产环境需谨慎开启以避免日志膨胀。
先说结论:开启 catch_workers_output 能捕获 worker 进程直接输出的内容,适合排查日志中缺失的警告或 echo 信息。
- 适合:开发环境调试、排查空白页或日志不全问题
- 先准备:确认 php-fpm 主日志路径 error_log 可写
- 再验证:reload 配置后触发脚本,检查主日志是否有预期输出
命令速用版
如果熟悉命令行,可以通过以下步骤快速定位并修改配置。注意不同 Linux 发行版的配置文件路径可能不同。
# 1. 查找 php-fpm 池配置文件位置 find /etc -name "www.conf" 2>/dev/null # 2. 修改配置,将 no 改为 yes(以 Ubuntu 为例) sed -i 's/catch_workers_output = no/catch_workers_output = yes/' /etc/php/8.1/fpm/pool.d/www.conf # 3. 平滑重载配置 systemctl reload php8.1-fpm
为什么会这样
PHP-FPM 的 worker 进程默认独立运行,其标准输出不会自动进入主日志。PHP-FPM 主进程与 worker 进程是分离的,worker 进程产生的 stdout 和 stderr 默认可能直接丢弃或发送到 Web 服务器日志,导致 php-fpm.log 中看不到某些 echo 或警告信息。开启该选项后,FPM 主进程会拦截这些输出并统一写入配置的 error_log 文件中,便于集中排查问题。
分步处理
按照以下顺序修改配置,确保每一步都有检查点,避免配置错误导致服务不可用。
步骤 1:确认配置文件路径
不同系统路径不同,常见路径如下:
- Ubuntu/Debian: /etc/php/{版本}/fpm/pool.d/www.conf
- CentOS/RHEL: /etc/php-fpm.d/www.conf
- 源码编译:/usr/local/php/etc/php-fpm.d/www.conf 或 php-fpm.conf
如果不确定,查看 phpinfo() 中的 FPM 配置路径,或使用 find 命令查找。
步骤 2:修改 catch_workers_output 参数
使用文本编辑器打开池配置文件,搜索 catch_workers_output。如果该行被注释(前面有分号;),去掉分号并将值改为 yes。
catch_workers_output = yes
步骤 3:确认主日志路径
捕获的输出会写入 php-fpm 的主错误日志,而不是网站的 access.log。在 php-fpm.conf 主配置文件中确认 error_log 路径。
error_log = /var/log/php-fpm/error.log
确保该文件所在目录存在且 php-fpm 运行用户有写入权限。
步骤 4:重载服务
修改完成后不要 restart,使用 reload 平滑重载配置,避免中断正在处理的请求。
systemctl reload php-fpm
怎么验证是否生效
配置修改后,需要通过实际输出来验证日志是否捕获成功。
验证动作:创建一个测试 PHP 文件,内容包含 echo 和 trigger_error。
<?php
echo "Test Output";
trigger_error("Test Error", E_USER_WARNING);
?>检查日志:在终端使用 tail 命令实时监控 FPM 主日志文件。
tail -f /var/log/php-fpm/error.log
判断结果:访问测试页面后,如果日志中出现 "Test Output" 或相关警告信息,说明配置生效。如果日志无变化,检查 Web 服务器(Nginx/Apache)是否拦截了输出,或确认修改的是正在运行的 PHP 版本配置文件。
常见坑
- 日志膨胀风险:生产环境如果代码中有大量 echo 或 debug 输出,开启此项会导致日志文件迅速增大,占用磁盘空间。
- 配置层级混淆:该参数属于池配置(pool config),通常在 www.conf 中修改,而不是 php.ini 或 php-fpm.conf 主文件。
- 权限问题:如果 error_log 指定的路径权限不足,FPM 可能启动失败或无法写入捕获的内容。
- 多版本共存:服务器同时运行多个 PHP 版本时,确保修改的是当前网站实际使用的 PHP-FPM 版本配置。
常见问题
开启后会影响性能吗?
对 CPU 计算性能影响极小,但会增加日志 I/O 写入量。在高并发场景下,频繁的日志写入可能成为瓶颈,建议仅在调试时开启。
能捕获 PHP 脚本的 echo 输出吗?
能,开启后 worker 进程的标准输出(包括 echo、print)会被重定向到 FPM 错误日志中。
为什么修改后日志还是空的?
检查是否修改了正确的 php-fpm 配置文件,确认是否执行了 reload 操作,并核实 error_log 路径是否有写入权限。
参考来源
- PHP Official Documentation - FPM Configuration: https://www.php.net/manual/en/install.fpm.configuration.php
- PHP Source Code - php-fpm.conf.default: https://github.com/php/php-src/blob/master/sapi/fpm/php-fpm.conf.in