You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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权限。


解决方案

二选一即可:

  1. 给日志文件开放属组写权限(推荐,保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:36:04