2015-04-22 60 views
9

我有以下目錄結構。file_get_contents與相對路徑

/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

前兩個讀取'detail.php',而不是'edit.json'。 – GolezTrol

+0

@GolezTrol。是的,這只是爲了測試目的。 – user1032531

+3

最好不要使用相對目錄,而是使用絕對路徑,例如'__DIR__','__FILE__',設置或其他服務器配置。另請參閱:[解決PHP相對路徑問題](http://yagudaev.com/posts/resolving-php-relative-path-problem/)瞭解如何和爲什麼。 – GolezTrol

回答

31

你試過:

$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進行計算。

+0

我還沒有嘗試,但我相信它會工作,因爲'__FILE__'工作。但問題是如何用相對路徑來做到這一點。 – user1032531

+0

一個非常有用的常量,但與使用'dirname()'沒有多大區別。 – GolezTrol

+0

@ user1032531啊yep公平點!也許看看['realpath()'](https://php.net/manual/en/function.realpath.php)。 –

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參數