log_errors设为On却无日志,主因是CLI与Web环境加载不同php.ini,需分别配置;error_log路径须存在且PHP进程用户有写权限;PHP-FPM还需开启catch_workers_output并指定php_admin_value[error_log]。

log_errors 为什么设成 On 却没日志?
常见现象是修改了 log_errors = On,但 error_log 文件始终为空。根本原因不是配置没生效,而是 PHP 实际运行时用的不是你改的那个 php.ini —— CLI 模式和 Web 模式(如 Apache 或 PHP-FPM)各自加载独立的配置文件。
执行 php --ini 查 CLI 的配置路径;访问 phpinfo() 页面看 Web 环境加载的是哪个 php.ini。两个环境必须分别配置,不能只改一个。
- Apache mod_php:通常读
/etc/php/*/apache2/php.ini - PHP-FPM:默认读
/etc/php/*/fpm/php.ini,注意 fpm 子进程用户(如www-data)需对error_log路径有写权限 - CLI:读
/etc/php/*/cli/php.ini,常被忽略,但 cron 或命令行调试全靠它
error_log 路径写对了,还是写不进去?
Linux 下最常卡在权限或父目录缺失。即使 error_log = /var/log/php_errors.log 看起来没问题,若 /var/log 下没有该文件,PHP 不会自动创建父目录,也不会报错,只是静默失败。
- 手动创建文件并赋权:
sudo touch /var/log/php_errors.log && sudo chown www-data:www-data /var/log/php_errors.log(Apache 用户可能是apache,PHP-FPM 通常用www-data) - 更稳妥的做法是把日志写到 Web 进程有天然权限的目录,比如
/var/www/html/logs/php_error.log,避免跨区权限纠缠 - 别用
chmod 777—— 安全风险高,且某些 SELinux 或 AppArmor 策略会直接拦截
display_errors 关掉后,开发怎么 debug?
display_errors = Off 是生产环境铁律,但它不等于“看不见错误”。关键是把错误导出到可查渠道,而不是回显到页面。
立即学习“PHP免费学习笔记(深入)”;
- 本地开发可临时开
display_errors = On,但上线前必须关;线上调试用tail -f /var/log/php_errors.log实时盯日志 - 配合
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT,过滤掉无实质影响的提示,聚焦真实问题 - 如果用 Laravel、Symfony 等框架,它们自带日志通道(如 Monolog),优先走框架日志而非 PHP 原生日志,避免混杂
PHP-FPM 场景下 catch_workers_output 必须开?
不开就看不到 echo、var_dump、stderr 输出——尤其是 FPM worker 进程崩溃前的最后几行,这对定位 segfault 或超内存退出极其关键。
- 在
www.conf(通常位于/etc/php/*/fpm/pool.d/www.conf)中确认:catch_workers_output = yes - 同时确保
php_admin_value[error_log] = /var/log/php-fpm-error.log显式指定,否则输出可能进系统日志(/var/log/syslog或/var/log/messages) - 改完重启 FPM:
sudo systemctl restart php*-fpm(版本号要匹配,如php8.1-fpm)



















