我有以下目录结构。
/var/www/base/controller/detail.php
/var/www/base/validate/edit.json
/var/www/html
在/var/www/base/controller/detail.php
内,如何将file_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');
答案 0 :(得分:59)
你试过了吗?
$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计算路径。
答案 1 :(得分:0)
原因是有可能使用include_path参数。将此参数设置为“1”,然后将在include_path(在php.ini中)中搜索文件。你必须在php.ini中进行编辑!
使用$ json = file_get_contents('detail.php');从php文件调用。 使用file_get_contents('detail.php');让detail.php执行。该文件必须位于根目录中(与file_get_contents()所在的调用php文件相同)。如果detail.php在子目录中,我看不到任何解决方法而不是使用include_path参数
答案 2 :(得分:0)
您总是可以先尝试做相反的事情以找出答案:
file_put_contents('FINDME', 'smth');
exit();
$json=file_get_contents('detail.php');
...
然后在* nix系统的终端上运行类似的操作(或在Windows上使用GUI搜索名为FINDME
的文件)
find <root-dir-of-the-project> -name 'FINDME'
该命令将输出如下内容:
<root-dir-of-the-project>/<directories>/FINDME
现在您知道尝试读取其他文件的文件的根目录(从中获取相对路径),并且可以轻松构造相对路径
答案 3 :(得分:0)
尝试使用此
$json = file_get_contents("/path/to/your/file/edit.json", true);
从PHP 5开始,FILE_USE_INCLUDE_PATH常量可用于触发包含路径搜索。如果启用了严格的类型,则这是不可能的,因为FILE_USE_INCLUDE_PATH是一个int。改用TRUE。