PHP include_once提示文件不存在但实际路径正确,求解决方法
看到你遇到的这个问题挺头疼的——明明路径在VSCode里能自动补全,却报找不到文件的错,而且报错里还出现了两个不同的目录(Project和Snapshot),先从几个关键点一步步排查:
1. 先揪出「实际执行脚本目录」的矛盾点
你看报错信息里的两行:
Warning: include_once(../settings/settings.php): failed to open stream: No such file or directory in /Applications/MAMP/htdocs/Project/classes/user.class.php on line 2
Warning: include_once(): Failed opening '../settings/settings.php' for inclusion (include_path='.:/Applications/MAMP/bin/php/php7.2.1/lib/php') in /Applications/MAMP/htdocs/Snapshot/classes/user.class.php on line 2
这里居然同时出现了Project和Snapshot两个目录!这大概率是核心问题:你VSCode里编辑的是Project下的文件,但MAMP实际运行的是Snapshot目录里的脚本。先检查MAMP的网站根目录是不是设成了Snapshot?或者两个目录之间有没有符号链接导致混淆?
2. 用绝对路径彻底规避相对路径的坑
相对路径../settings/settings.php是基于脚本执行时的当前工作目录,而不是user.class.php所在的目录,这是很多开发者踩坑的点。直接用PHP的__DIR__常量(代表当前文件所在的绝对目录)来拼接路径,改成:
include_once(__DIR__ . '/../settings/settings.php');
这样不管工作目录是什么,路径都是绝对正确的,先试试这个能不能解决问题,也能快速验证是不是相对路径的锅。
3. 确认当前工作目录到底是什么
在user.class.php的开头加一行代码,打印出当前的工作目录:
echo getcwd(); die;
运行脚本后看看输出的目录是不是你预期的(比如/Applications/MAMP/htdocs/Project),如果不是,那相对路径自然会出错——比如如果工作目录是/Applications/MAMP/htdocs,那../settings就跑到htdocs的上一级去了,肯定找不到文件。
4. 检查文件名大小写和文件权限
虽然MacOS默认不区分文件名大小写,但MAMP的PHP环境可能会严格区分?确认settings.php的文件名和代码里的完全一致(比如有没有写成Settings.php)。另外,检查文件权限:确保Web服务器的用户(比如MAMP里的_www用户)有读取这个文件的权限,把文件权限改成644试试。
5. 核对include_path的设置
报错里显示include_path='.:/Applications/MAMP/bin/php/php7.2.1/lib/php',这里的.代表当前工作目录,你的../settings/settings.php不在这个路径里,所以include_path帮不上忙。如果想用相对路径,也可以把settings目录的绝对路径加到include_path里,但还是用__DIR__的方法更可靠。
内容的提问来源于stack exchange,提问作者Zanic L3

