具有相对路径

时间:2015-04-22 13:10:40

标签: php

我有以下目录结构。

/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');

4 个答案:

答案 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。