具有相对路径的file_get_contents

php
2022-08-30 10:59:39

我有以下目录结构。

/var/www/base/controller/detail.php
/var/www/base/validate/edit.json
/var/www/html

在其中,如何使用相对路径进行读取?我尝试了以下方法:/var/www/base/controller/detail.phpfile_get_contents()/var/www/base/validate/edit.json

//failed to open stream: No such file or directory (error no: 2)
$json=file_get_contents('detail.php');

//No error, but I don't want this file and was just testing
$json=file_get_contents('detail.php', FILE_USE_INCLUDE_PATH);

//failed to open stream: No such file or directory (error no: 2)
$json=file_get_contents('./validate/edit.json', FILE_USE_INCLUDE_PATH);
//failed to open stream: No such file or directory (error no: 2)
$json=file_get_contents('../validate/edit.json', FILE_USE_INCLUDE_PATH);
//failed to open stream: No such file or directory (error no: 2)
$json=file_get_contents('././validate/edit.json', FILE_USE_INCLUDE_PATH);
//failed to open stream: No such file or directory (error no: 2)
$json=file_get_contents('../../validate/edit.json', FILE_USE_INCLUDE_PATH);

//This works, but I want to use a relative path
$json=file_get_contents(dirname(dirname(__FILE__)).'/validate/edit.json');

答案 1

您是否尝试过:

$json = file_get_contents(__DIR__ . '/../validate/edit.json');

__DIR__是一个有用的魔法常数。

有关原因,请参阅 http://yagudaev.com/posts/resolving-php-relative-path-problem/

当一个PHP文件包含另一个PHP文件时,它本身包含另一个文件 - 所有文件都在单独的目录中 - 使用相对路径来包含它们可能会引起问题。

PHP经常会报告它找不到第三个文件,但为什么呢?答案在于,当在PHP中包含文件时,解释器会尝试在当前工作目录中查找文件。

换句话说,如果在名为 A 的目录中运行脚本,并且包含一个在目录 B 中找到的脚本,则在执行在目录 B 中找到的脚本时,将相对于 A 解析相对路径。

因此,如果目录 B 中的脚本包含位于不同目录中的另一个文件,则仍会像您预期的那样相对于 A 而不是相对于 B 计算路径。


答案 2

尝试使用这个

$json = file_get_contents("/path/to/your/file/edit.json", true);

从 PHP 5 开始,FILE_USE_INCLUDE_PATH常量可用于触发包含路径搜索。如果启用了严格类型,则这是不可能的,因为FILE_USE_INCLUDE_PATH是一个int。请改用 TRUE。


推荐