
本文详解如何在php中通过相对路径安全读取上级目录中的文件,重点解决file_get_contents("../indexed.txt")失效问题,并推荐使用__dir__与dirname()组合的健壮方案。
本文详解如何在php中通过相对路径安全读取上级目录中的文件,重点解决file_get_contents("../indexed.txt")失效问题,并推荐使用__dir__与dirname()组合的健壮方案。
在PHP开发中,常需从深层嵌套的脚本(如 Onuranon/bangla/questions/board-questions/first-paper/bnfirpap.php)读取位于上级目录(如 Onuranon/indexed.txt)的配置或数据文件。但直接使用 file_get_contents("../indexed.txt") 往往失败——根本原因在于:.. 是相对于当前工作目录(working directory),而非脚本所在目录。而PHP脚本的当前工作目录由Web服务器(如Apache)或CLI执行环境决定,通常为Web根目录(如 /var/www/html)或项目入口目录,并非脚本自身位置。因此,../indexed.txt 实际指向的是该工作目录的上一级,而非 bnfirpap.php 所在目录的上一级。
✅ 正确做法是:始终以脚本自身位置为基准构建绝对路径。PHP提供了两个关键工具:
- __DIR__:魔术常量,返回当前PHP文件所在的绝对目录路径(不含尾部斜杠);
- dirname():可递归调用,每次向上跳一层目录。
根据你的目录结构:
Onuranon/ ├── indexed.txt ← 目标文件 ├── Bangla/ ← 注意:实际路径中为小写 'bangla'(见问题描述) │ └── questions/ │ └── board-questions/ │ └── first-paper/ │ └── bnfirpap.php ← 当前脚本
要从 bnfirpap.php 安全读取 Onuranon/indexed.txt,需向上跨越 4 层(first-paper → board-questions → questions → bangla → Onuranon)。但注意:__DIR__ 指向 first-paper 目录,因此:
// 步骤1:获取 bnfirpap.php 所在目录(first-paper) $baseDir = __DIR__; // e.g., /E:/Onuranon/bangla/questions/board-questions/first-paper // 步骤2:逐级向上跳转至 Onuranon 目录 $onuranonDir = dirname(dirname(dirname(dirname($baseDir)))); // 等价于:dirname(dirname(dirname(__DIR__))); // 步骤3:拼接目标文件路径并读取 $filePath = $onuranonDir . '/indexed.txt'; $contents = file_get_contents($filePath); echo $contents; // 成功输出文件内容
? 更简洁、可读性更强的写法(推荐):
$indexedPath = dirname(dirname(dirname(dirname(__DIR__)))) . '/indexed.txt'; $contents = file_get_contents($indexedPath);
⚠️ 重要注意事项:
- 路径分隔符兼容性:Windows 使用反斜杠 \,Linux/macOS 使用正斜杠 /。PHP 的 dirname() 和 __DIR__ 自动适配系统,拼接时统一用 / 即可(PHP内部会自动转换);
- 权限检查:确保Web服务器用户对 indexed.txt 具有读取权限;
- 错误处理:生产环境务必添加异常处理:
if (file_exists($indexedPath)) { $contents = file_get_contents($indexedPath); } else { throw new RuntimeException("File not found: {$indexedPath}"); } - 大小写敏感:Linux 文件系统区分大小写,请确认实际目录名为 bangla(非 Bangla),否则路径将失效。
总结:摒弃依赖不确定的当前工作目录的相对路径(如 ../),坚持使用 __DIR__ 作为锚点,配合 dirname() 精准定位,是PHP中跨目录读取文件最可靠、可移植性最强的实践方式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











