PHP脚本浏览器运行正常,定时任务执行mkdir时提示Permission denied
解决定时任务执行PHP脚本时的mkdir权限拒绝问题
这种情况我碰到过好多次啦,核心原因就是浏览器运行脚本和定时任务运行脚本的用户身份不一样,导致权限不匹配。结合你的Plesk+CentOS环境,我给你一步步分析和解决:
1. 先搞清楚两个环境的运行用户
- 浏览器访问时,PHP脚本是由web服务器用户执行的(你的环境里大概率是
nginx用户,或者apache?可以在脚本里加一行echo exec('whoami');,浏览器访问后就能看到当前执行用户) - 定时任务执行时,默认是你设置任务时选择的系统用户(比如Plesk对应的站点用户,或者root)。可以先建个测试脚本
test_user.php:
然后用定时任务执行这个脚本,查看输出结果,就能明确定时任务的运行身份和工作路径了。<?php echo "当前执行用户:" . exec('whoami') . "\n"; echo "当前工作目录:" . getcwd() . "\n"; ?>
2. 针对性解决权限问题
根据上面的信息,你可以选下面的方案之一:
方案一:让定时任务以web服务器用户身份执行
在Plesk的定时任务设置里,找到“运行用户”的选项,选择web服务器用户(比如nginx);如果没有这个选项,就用命令行方式执行:
su -s /bin/sh nginx -c "/opt/plesk/php/5.4/bin/php /var/www/vhosts/你的域名/httpdocs/你的脚本.php"
注意替换成你实际的PHP路径(Plesk中PHP5.4的路径通常是/opt/plesk/php/5.4/bin/php)和脚本绝对路径,也可以用which php命令确认PHP的准确路径。
方案二:调整目标目录的权限
如果不想切换用户,就给你要创建目录的路径添加定时任务用户的写入权限。比如定时任务用户是plesk_user,目标目录是/var/www/vhosts/你的域名/httpdocs/upload:
# 把目录所有者改成定时任务用户和web组 chown -R plesk_user:nginx /var/www/vhosts/你的域名/httpdocs/upload # 给组添加写入权限 chmod -R g+w /var/www/vhosts/你的域名/httpdocs/upload
这样不管是web用户还是定时任务用户都能读写这个目录了,注意不要给全局写入权限(chmod 777),会带来安全风险。
方案三:确保脚本里用绝对路径
有时候定时任务的工作目录不是脚本所在的目录,导致你用相对路径创建目录时,实际要创建的路径是定时任务的工作目录(比如/root),而这个目录定时任务用户没有权限。所以一定要在mkdir里用绝对路径,比如:
// 错误:相对路径 // mkdir('new_folder', 0755, true); // 正确:绝对路径 mkdir('/var/www/vhosts/你的域名/httpdocs/new_folder', 0755, true);
额外提醒
Plesk里的定时任务环境变量可能和web环境不一样,所以脚本里用到的路径、命令都尽量用绝对路径,避免找不到文件或者命令的问题。
内容的提问来源于stack exchange,提问作者Paolo Sanna




