PHP脚本浏览器可正常删文件,cPanel定时任务报错文件不存在
解决cPanel定时任务执行PHP脚本时unlink找不到文件的问题
这问题我碰到过好多次啦,核心原因大概率是工作目录不一致导致的相对路径失效!
问题根源
当你通过浏览器访问脚本时,PHP的工作目录是脚本所在的public_html文件夹,所以你用unlink('property_a.xml')这种相对路径能精准找到目标文件;但cPanel的定时任务默认是从你的用户根目录(也就是/home/pbjwbh0mgv9o/)开始执行的,这时候脚本里的相对路径就会指向根目录下的文件,而不是public_html里的,自然会报“No such file or directory”的错误。
靠谱的解决办法
办法一:改用绝对路径操作文件
直接修改脚本里的unlink代码,用PHP内置的__DIR__常量拼接绝对路径(__DIR__会返回当前脚本所在的目录路径,PHP 5.3及以上版本支持):
// 第63行修改为 unlink(__DIR__ . '/property_a.xml'); // 第215行修改为 unlink(__DIR__ . '/property_map.xml');
这种方式最稳妥,不管脚本被哪里调用,都能精准定位到文件。如果你的PHP版本比较旧,也可以用dirname(__FILE__)代替__DIR__。
办法二:修改定时任务命令,先切换工作目录
如果不想改动脚本代码,也可以调整定时任务的执行命令,先切换到脚本所在的目录再执行PHP:
cd /home/pbjwbh0mgv9o/public_html && /usr/local/bin/php -q buildlistings.php
这样执行时的工作目录就和浏览器访问时完全一致,相对路径就能正常生效了。
额外排查点
- 文件权限问题:定时任务的执行用户和浏览器访问的用户(通常是
nobody或apache)可能不同,要确保这两个用户都有目标文件的删除权限。建议把文件权限设为644,所在目录权限设为755。 - 检查其他相对路径操作:如果脚本里还有读取、写入文件的操作,也要统一处理成绝对路径,避免出现类似问题。
内容的提问来源于stack exchange,提问作者Vince Anderson




