簡體   English   中英

php中的相對文件路徑

[英]relative File path in php

簡潔版本:
相對路徑如何在php中運行?


長版:
我有一個本地網站( http://test.com ), E:\\test\\是它的文檔根目錄。 這是我的目錄樹:

  1. E:\\測試\\ 001.php
  2. E:\\測試\\ exit.php
  3. E:\\測試\\ death.txt
  4. E:\\測試\\ mysql的\\ first.php
  5. E:\\測試\\ mysql的\\ death.txt
  6. E:\\測試\\ mysql的\\ exit.php

和文件內容:

E:\\測試\\ 001.php

<?php

include('mysql/first.php');

?>

E:\\測試\\ exit.php

<?php
die('What?');
?>

E:\\測試\\ death.txt

Bonjour

E:\\測試\\ mysql的\\ first.php

<?php
echo file_get_contents('death.txt');
include('exit.php');
?>

E:\\測試\\ mysql的\\ death.txt

Hello there

E:\\測試\\ mysql的\\ exit.php

<?php
die('DONE');
?>

如果我瀏覽http://test.com/001.php並且E:\\test\\exit.phpE:\\test\\death.txt存在,我得到這個:

BonjourWhat?

如果它們不存在:

Warning: file_get_contents(death.txt) [function.file-get-contents]: failed to open stream: No such file or directory in E:\test\mysql\first.php on line 2
DONE

如何在php中運行相對路徑? 我認為它應該給我兩個文件的警告或顯示正確的輸出!
我正在使用XAMPP,php 5.3在Win7 x64上測試此代碼。

這就是php.net上的文檔描述PHP include搜索機制的方式:

  1. 首先,它將查看include_path: http//php.net/manual/en/ini.core.php#ini.include-path
  2. 然后,如果在include_path中找不到任何內容,它將嘗試將文件加載到調用腳本自己的目錄中。 (在我們的例子中,根目錄)
  3. 最后,如果其他一切都失敗了,它將嘗試在當前目錄中找到該文件。

當我運行你的腳本時,我的include路徑設置為.:默認情況下(當前目錄,沒有別的),所以當我嘗試從mysql/first.php加載death.txtexit.php ,它應該搜索./文件夾是當前目錄。 但是...... 事實並非如此 當前目錄應該是mysql/但它沒有指向那里......那么這里發生了什么?

PHP非常特別......讓我們回滾到我們做的第一個聲明。 什么是PHP解釋在我們的include path時使用. 實際上是一個路徑解決方案! 所以,看看我們的道路,我們有. 使用include_path無法解釋( ./.再次?)任何內容。 然后,PHP必須轉到第二個路徑解析(2),它是我們腳本的根目錄。 (你有頭疼嗎?因為我這樣做)

使用get_include_path()realpath()可以觀察到:

Included path: '.:'
Including mysql/first.php: /Users/Kouno/Development/SandBox/test-php/mysql/first.php
This is what `realpath` returns for './': /Users/Kouno/Development/SandBox/test-php
Getting content of death.txt: /Users/Kouno/Development/SandBox/test-php/death.txt
Bonjour
Including exit.php: /Users/Kouno/Development/SandBox/test-php/exit.php
What?

然后,為什么它特別無法加載mysql/death.txt但仍然找到mysql/exit.php ,一旦你從根目錄中刪除death.txtexit.php 它應該找到它們兩個,對吧?

好吧,這是因為get_file_content有第二個參數默認忽略include_path

如果設置第二個參數:

echo file_get_contents('death.txt', FILE_USE_INCLUDE_PATH);

然后你會得到預期的結果。

Included path: '.:'
Including mysql/first.php: /Users/Kouno/Development/SandBox/test-php/mysql/first.php
Getting content of death.txt: (no path returned)
Hello there
Including exit.php: (no path returned)
DONE

有趣的是get_file_content()將開始使用與include相同的機制(這在php.net上沒有正確記錄)。 並且realpath()甚至根本沒有實現這種機制(這解釋了為什么我no path returned顯示的no path returned )。

希望這可以幫助!

first.php在E:\\ test \\ mysql中找到文件death.txt。 您可以使用:

echo file_get_contents($_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'death.txt');

要么:

echo file_get_contents('..' . DIRECTORY_SEPARATOR . 'death.txt');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM