php-fpm的www-error.log中出现Generic Error日志的原因是什么?
问题现象
- 错误日志路径:
/var/log/php-fpm/www-error.log - 不定期输出日志内容:
[27-Jun-2022 12:36:39 UTC] Generic Error
- 出现时机:执行
sudo yum update升级Amazon Linux 2软件栈后开始出现,业务代码未主动抛出该字符串错误,所有业务逻辑运行正常,未使用第三方开发框架,上层业务代码为自主编写。 - 环境信息:
- PHP-FPM版本:
PHP 7.4.19 (fpm-fcgi)(构建时间2021-05-13),搭载Zend Engine v3.4.0 - 系统内核版本:
4.14.200-155.322.amzn2.x86_64 - 系统发行版:Amazon Linux 2,二进制兼容CentOS/RHEL/Fedora生态
- PHP-FPM版本:
具体触发原因
该日志由两个因素共同触发:
- Amazon Linux 2源2022年中推送的php-7.4.19软件包补丁缺陷:该版本PHP的错误处理逻辑被发行版打包方加入了自定义补丁,当触发的错误实例消息字段为空时,官方原版逻辑会跳过该类无明确信息的错误不写入日志,而该补丁会自动填充
Generic Error作为默认消息写入错误日志。 - 请求生命周期结束后的上下文丢失错误:这类无消息的低级别错误通常来自两个场景:
- 代码调用
fastcgi_finish_request()提前向客户端返回响应后,后续后台执行的逻辑触发了warning/notice/deprecated级别的错误,此时请求上下文已经被释放,PHP无法获取错误对应的文件、行号、具体提示内容,生成空消息的错误实例 - 客户端主动断开连接(如用户关闭页面、前端请求超时断开)后,服务端PHP进程继续执行剩余逻辑时触发低级别错误,同样会丢失错误上下文,生成空消息错误
这类错误属于无危害的低级别提示,不会中断请求执行,因此业务侧不会感知到异常。
排查与修复方案
- 定位具体触发点:在项目入口文件注册shutdown回调,打印完整错误结构到独立日志:
register_shutdown_function(function() { $err = error_get_last(); if ($err) { file_put_contents('/tmp/php_full_error.log', print_r($err, true), FILE_APPEND); } });
获取到错误的type字段后,可对应PHP错误级别常量定位触发位置,高频触发点为fastcgi_finish_request()之后执行的数据库连接隐式关闭、curl短连接释放、临时文件写入等操作触发的无提示warning。
- 彻底消除日志:执行
sudo yum update php升级到Amazon Linux 2源内7.4.30及以上版本的PHP包,后续打包版本已经移除了该异常补丁,空消息的低级别错误不会再写入fpm错误日志。 - 临时规避方案:修改php-fpm的www.conf配置,过滤低级别错误写入:
php_admin_value[error_reporting] = E_ALL & ~E_NOTICE & ~E_WARNING & ~E_DEPRECATED
配置修改后执行sudo systemctl restart php-fpm即可生效。
内容的提问来源于stack exchange,提问作者julius patta
相关产品推荐
相关产品推荐

