PHP致命错误不写日志的主因是log_errors=Off或error_reporting未覆盖E_ERROR,需开启log_errors、设合适error_reporting、重启php-fpm、检查路径权限及配置生效位置,并排查php-fpm日志与display_errors干扰。

PHP致命错误不写日志?先确认error_log是否真生效
宝塔面板里改了php.ini的error_log路径,但error_log文件还是空的——大概率是display_errors开着,而log_errors关着,或者error_reporting压根没覆盖E_ERROR级别。
-
log_errors = On必须开启,否则任何错误都不会落盘 -
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED这类写法会漏掉E_ERROR,建议直接用E_ALL或E_COMPILE_ERROR | E_ERROR | E_PARSE - 如果用了
php-fpm,改完php.ini后必须重启php-fpm服务,只重载Nginx没用 - 检查
error_log路径权限:PHP进程用户(如www)得有写入权限,常见坑是路径在/www/wwwroot/xxx/下但目录属主是root
宝塔里改php.ini后没生效?别只点“保存”
宝塔的PHP设置页面点“保存”只是写入配置模板,实际生效要靠“重载配置”按钮——而且得对应到你当前站点用的PHP版本。
- 进“软件管理”→ 找到你站点用的PHP版本(比如
PHP-8.1)→ 点“设置”→ “配置修改”,这里改的是全局php.ini - 如果站点启用了“单独PHP版本”或“自定义php.ini”,优先级更高,得去“网站”→ 站点 → “设置” → “PHP版本”里点“配置文件”去改
- 改完务必点“重载配置”,不是“重启PHP”,后者可能中断正在运行的请求
- 验证是否生效:
phpinfo()页面里搜error_log和log_errors,看值是不是你设的
致命错误只在浏览器报500,日志却没记录?查php-fpm慢日志和错误日志
有些Fatal error(比如Allowed memory size exhausted)会直接让PHP进程崩溃,这时php.ini的error_log可能来不及写入,得看php-fpm自己的日志。
- 打开
php-fpm配置:宝塔 → “软件管理” → 对应PHP版本 → “配置修改”,找到php-fpm.conf里的error_log和slowlog路径 -
php-fpm错误日志通常在/www/server/php/{版本}/var/log/php-fpm.log,里面会有child exited on signal 11这类关键线索 - 启用
slowlog能抓到卡死前的调用栈,对Segmentation fault类问题特别有用 - 注意
php-fpm日志等级默认是warning,致命错误会记为error,但得确保log_level = error没被注释掉
日志有了,但堆栈不完整?加display_errors = Off再试
很多情况下display_errors = On会导致PHP提前终止输出,堆栈被截断,尤其在require或include出错时。
- 临时把
display_errors = Off,强制错误只走日志,往往能拿到完整Call Stack - 配合
html_errors = Off,避免HTML标签混在日志里干扰grep - 如果用了
Xdebug,记得关掉xdebug.mode = develop,它有时会干扰致命错误的捕获流程 - 日志行末带
in Unknown on line 0?说明错误发生在PHP启动阶段(比如扩展加载失败),得去php -m或php --ini排查扩展冲突
最麻烦的其实是错误发生在auto_prepend_file或opcache预编译阶段,这时候连php-fpm日志都可能沉默——得开opcache.enable_cli=1用命令行复现。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











