get_current_user返回root且日志属主为root时file_put_contents写入失败问题
日志写入失败问题排查及解决
核心错误原因
你被get_current_user()的返回值误导了:这个函数返回的是当前PHP脚本文件的所有者,而非PHP进程实际运行的系统用户。
你的服务跑在nginx+PHP-FPM架构下,默认PHP进程的运行用户是www-data,并非root。结合你给出的日志文件权限-rw-r--r-- 1 root www-data 0 Nov 22 20:43 lms2.0_test_errors.log,只有属主root有读写权限,属组www-data仅拥有读权限,因此www-data身份的进程没有写入权限,直接导致写入失败。
排查步骤
- 确认PHP进程实际运行用户:在出错的PHP代码中加入以下代码即可输出真实执行身份:
// 方案1:通过POSIX函数获取有效运行用户 echo posix_getpwuid(posix_geteuid())['name']; // 方案2:直接调用系统命令查看 echo exec('whoami');
- 验证父目录权限:需要确保日志文件的每一级父目录都对PHP运行用户开放执行权限(x权限),否则即使文件权限正确也无法访问,执行以下命令可查看全路径权限配置:
namei -om /var/logs/private/do_not_backup/lms2.0_test_errors.log
确认/var/logs、/var/logs/private、/var/logs/private/do_not_backup三级目录都对www-data用户开放x权限。
解决方案
二选一即可:
- 给日志文件开放属组写权限(推荐,保留root作为文件属主)
chmod g+w /var/logs/private/do_not_backup/lms2.0_test_errors.log
修改后文件权限变为-rw-rw-r--,属组内的www-data用户即可正常写入。
2. 直接将日志文件的所有者修改为PHP进程运行用户
chown www-data:www-data /var/logs/private/do_not_backup/lms2.0_test_errors.log
修改后www-data作为文件属主,默认拥有读写权限。
内容的提问来源于stack exchange,提问作者Neil Wehneman
相关产品推荐
相关产品推荐

