使用systemd运行PHP脚本时无法写入日志文件的问题
解决systemd运行PHP脚本无法写入日志的问题
遇到这种手动运行正常、通过systemd服务跑就无法写入日志的情况,我之前也踩过类似的坑,大概率是路径、权限或者运行环境的差异导致的,给你几个具体的排查和解决方向:
相对路径导致日志写入到了意外位置
手动运行脚本时,你的工作目录是脚本所在的文件夹,所以./log_...会写到脚本目录下;但systemd运行服务时,默认的工作目录通常是/或者服务用户的家目录(比如/root),而非脚本所在目录。解决办法是在脚本中使用绝对路径来指定日志文件:
// 获取脚本所在的绝对目录 $scriptDir = dirname(__FILE__); // 拼接日志文件的绝对路径 $logFile = $scriptDir . '/log_' . date("j.n.Y") . '.txt'; $log = "Api: " . $de->detail . " | " . date("h:i:sa") . " UTC" . PHP_EOL; file_put_contents($logFile, $log, FILE_APPEND);systemd服务的运行用户没有写入权限
手动运行时你用的是自己的用户账号,但systemd默认可能用root或者其他系统用户(比如www-data)运行服务,而脚本所在目录的权限不允许这个用户写入。有两种解决方式:
- 修改systemd服务配置文件(比如
your_script.service),指定和手动运行相同的用户:
修改后重启服务生效:[Service] User=你的用户名 Group=你的用户组 ExecStart=/usr/bin/php /path/to/your/script.phpsudo systemctl daemon-reload && sudo systemctl restart your_script.service - 给脚本所在目录设置合适的权限,允许服务运行用户写入:
sudo chown -R 服务运行用户:用户组 /path/to/script/directory sudo chmod -R 755 /path/to/script/directory
- 修改systemd服务配置文件(比如
SELinux限制(仅适用于CentOS/RHEL系列系统)
如果你的服务器开启了SELinux,它可能会阻止systemd进程写入普通用户的目录。可以先临时关闭SELinux测试:sudo setenforce 0如果测试后日志能正常写入,就添加SELinux规则允许该目录的写入权限:
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/path/to/script/directory(/.*)?" sudo restorecon -Rv /path/to/script/directoryPHP环境配置差异
systemd运行时的PHP环境可能和你手动登录的环境不同,比如open_basedir限制了PHP能写入的路径。可以在脚本开头添加代码检查并调整:// 查看当前open_basedir设置(可临时启用查看) // echo ini_get('open_basedir'); // 添加日志目录到允许列表 ini_set('open_basedir', ini_get('open_basedir') . ':/path/to/script/directory');
另外,你可以先通过find命令排查日志是否写到了其他位置,确认问题根源:
sudo find / -name "log_*.txt"
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

