PHP日志不写入主因是error_log路径不可写、进程用户与文件所有者不一致,或受open_basedir、SELinux限制;需用ini_get('error_log')查真实路径,逐级验证权限链,并检查多配置文件覆盖及安全策略。

PHP 修改权限后日志不写入,大概率不是权限没改对,而是 error_log 配置指向了不可写路径,或 PHP 进程用户与文件所有者不一致。
确认 PHP 实际使用的 error_log 路径
别只看 php.ini 里写的 error_log,运行时可能被覆盖。用以下代码查真实值:
var_dump(ini_get('error_log'));
常见陷阱:
-
error_log设为syslog时,日志根本不会写文件,而是发给系统日志服务 -
error_log是相对路径(如logs/php_error.log),实际写入位置取决于 PHP 进程当前工作目录,不是 Web 根目录 - FPM 模式下,
php-fpm.conf或 pool 配置中可能有php_admin_value[error_log],它会强制覆盖php.ini
检查日志文件路径的写入权限链
权限问题不是“文件可写就行”,要逐级验证整个路径是否对 PHP 进程用户可写:
立即学习“PHP免费学习笔记(深入)”;
- 运行
ps aux | grep php确认 PHP 进程用户(如www-data、nginx或apache) - 对日志路径执行
namei -l /var/log/myapp/php_error.log,查看每一级目录的所有者和权限 - 确保从根目录到最深层目录,每个环节都对 PHP 用户有
x(执行/进入)权限;最终文件需有w(写)权限,且父目录也要有w才能创建/重命名文件
典型错误:把 /var/log/myapp 目录权限设为 755 root:root,但 PHP 进程用户不是 root,也无法进入该目录。
注意 open_basedir 和 selinux 限制
即使权限全开,日志仍不写入,可能是安全机制拦截:
- 检查
open_basedir是否包含日志路径:var_dump(ini_get('open_basedir'));,若不包含,PHP 会拒绝写入 - 在 CentOS/RHEL 上运行
getenforce,若返回Enforcing,再查ausearch -m avc -ts recent | grep httpd或php-fpm,看是否有 selinux 拒绝写日志的记录 - 临时测试可执行
setsebool -P httpd_can_network_connect 1(仅限需要网络日志)或chcon -t httpd_log_t /path/to/error.log
真正卡住的往往不是 chmod 777,而是 PHP 进程用户、open_basedir、selinux 三者中某一个没对上——尤其当服务器由不同人维护时,配置分散在 php.ini、php-fpm.d/www.conf、httpd.conf、selinux 多个地方,漏查一处就白调。











