PHP报错:require_once找不到文件但文件实际存在的原因排查
问题原因与解决方案
这问题我之前排查过好多次!核心坑点在于CLI模式下PHP的工作目录并不是脚本所在的目录,而是你执行命令时所在的当前目录。
具体分析
当你运行命令:
sudo -u apache php /var/www/html/PDR/src/php/pages/menu-tiles.php
PHP的工作目录是你敲这条命令时所在的目录(比如你的用户主目录/root或者/home/your-user),而不是脚本所在的/var/www/html/PDR/src/php/pages/。这时候../../../default.php会从当前工作目录往上回溯三层,自然找不到实际位于/var/www/html/PDR/default.php的文件——哪怕文件确实存在且权限没问题。
几个可行的解决方案
方案1:切换到脚本目录再执行
用shell命令先进入脚本所在目录,再执行PHP脚本,确保相对路径的基准正确:sudo -u apache sh -c "cd /var/www/html/PDR/src/php/pages/ && php menu-tiles.php"(直接用
sudo -u apache cd ... && php ...不行,因为cd是shell内置命令,需要通过sh -c来执行整个命令链)方案2:用绝对路径引入(推荐)
修改PHP脚本里的引入语句,用__DIR__常量(代表当前脚本所在目录的绝对路径)拼接目标文件路径,彻底摆脱工作目录的影响:require_once(__DIR__ . '/../../../default.php');这种方式最可靠,不管脚本是通过CLI执行还是Web服务器调用,路径都不会出错。
方案3:在脚本开头切换工作目录
在require_once之前先切换到脚本所在目录,再用相对路径引入:chdir(__DIR__); require_once('../../../default.php');
验证方法
如果你想确认工作目录的问题,可以在脚本第17行(报错行之前)加一行代码:
echo "当前工作目录:" . getcwd() . "\n";
执行命令后就能看到PHP实际使用的工作目录,一眼就能明白为什么找不到文件了。
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

