在 Ubuntu 上 PHP 日志“不写”通常是配置、权限或运行方式导致的。下面按最常见原因逐一排查,你可以对照看。
php --ini
编辑对应 php.ini(如 /etc/php/8.1/fpm/php.ini 或 cli 的)
关键三项:
log_errors = On
error_log = /var/log/php/php_errors.log
⚠️ 如果 error_log 没设置,PHP 会交给 SAPI(如 nginx / apache)处理。
PHP-FPM 不会写 php.ini 里的 error_log
查看:
/etc/php/8.1/fpm/pool.d/www.conf
找到:
catch_workers_output = yes
php_admin_value[error_log] = /var/log/php/fpm-error.log
php_admin_value[log_errors] = On
否则错误只会出现在:
/var/log/php8.1-fpm.log
ls -ld /var/log/php
如果目录不存在或权限不对:
sudo mkdir -p /var/log/php
sudo chown www-data:www-data /var/log/php
sudo chmod 755 /var/log/php
然后:
sudo touch /var/log/php/php_errors.log
sudo chown www-data:www-data /var/log/php/php_errors.log
error_reporting = E_ALL
或在代码里:
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
@file_get_contents('x'); // 不写日志
@ 会抑制错误日志。
CLI 模式:
php script.php
读的是:
/etc/php/8.1/cli/php.ini
Web 模式:
/etc/php/8.1/fpm/php.ini
✅ 两者配置可能完全不同
fastcgi_intercept_errors on;
否则 PHP 错误不会进 nginx 日志
<?php
error_log("TEST PHP LOG");
然后:
tail -f /var/log/php/php_errors.log
| 原因 | 解决 |
|---|---|
| error_log 未设置 | 设置路径 |
| 目录无权限 | chown www-data |
| PHP-FPM 不读 php.ini | 改 pool 配置 |
| @ 抑制 | 去掉 |
| CLI / FPM 混用 | 分清 ini |
| 没重启 | systemctl restart php8.1-fpm |
如果你愿意,可以告诉我:
我可以直接给你精确配置文件内容。