2016-02-24 87 views
0

我很茫然,爲什麼我有這個問題。我在Windows 7上運行IIS進行開發,但有一個用於Web主機的Linux服務器。PHP基路徑'/'不適用於文件系統功能

問題是,每當我使用PHP系統函數,如file_exists()move_uploaded_file(),使用像/support/images/flags/countries/這樣的路徑總是失敗。支持目錄位於網站的根目錄下。我所閱讀的所有文件似乎都表明該路徑應該起作用。這是因爲我使用Windows嗎?即使是SO上的帖子似乎也認爲它應該起作用。

爲了得到它的正確我不得不用這樣的{$_SERVER['DOCUMENT_ROOT']}/support/images/flags/countries

路徑任何人都可以解釋爲什麼我的想法是錯誤的工作?

+0

我不是100%確定,但我認爲你應該使用其他欄。 '\' – Phiter

+0

@PiterFernandes:根據IIS文檔'\'或'/'是可以接受的。 – CharlesEF

回答

0

使用$_SERVER['DOCUMENT_ROOT']不是一個好主意,特別是如果您打算在您的應用程序中使用CLI(服務器變量不可用)。你應該嘗試像

dirname(__FILE__) 

在你的腳本,而不是,或考慮引入一個自定義的常量,它會包含到你的根文件夾的完整系統路徑 - 例如,

define('MY_APP_ROOT', '/my/full/path/'); 

容易得多不是依靠阿帕奇或者IIS中。

+0

然後根據示例仍然存在'/ support/images/flags/countries'的問題,它在腳本內部使用,不作爲URI顯示給用戶。 – Xorifelse

+0

@SergeyVidusov:在這一點上,我的應用程序沒有使用CLI的計劃,但您的答案是需要思考的問題。謝謝。 – CharlesEF

+0

不用擔心。同樣考慮爲數據文件夾設置一個單獨的常量,如果你將它保存在www-root之外。 –

0

您應該在PHP中使用DIRECTORY_SEPARATOR常量。文件和文件夾在Linux中的工作有所不同。使用這將保持Windows和Linux的兼容性。

這是我一直在使用,以構建路徑的一個小功能:

function buildPath(...$segments){ 
    return join(DIRECTORY_SEPARATOR, $segments); 
} 

echo buildPath('path', 'to', 'folder'); 

也是另一種兼容的訣竅是,Linux的選擇「表格」的時候是大小寫敏感的,也是在數據庫中。在Windows中,無論你如何編寫它,它都可以工作,在Linux上它必須完全一樣。

使用正斜槓在瀏覽器中創建鏈接是一種方式,例如將人鏈接到/var/wwww/css/index.css(很可能只是./css/index.css),但對於內部操作,Linux中需要反斜槓。

+0

前後斜槓通常都可以通過IIS和Apache來接受,所以我不認爲這會給OP帶來麻煩。 –

+0

@Xorifelse:我總是使用小寫,所以這不是問題。 UNIX類型的操作系統總是使用'​​/'目錄分隔符。但是,謝謝你的回答,我會思考一段時間。 – CharlesEF

+0

只是說,'\'相對於根和'/'相對於文件的開始標誌。就個人而言,我不使用複雜的目錄結構,我通常使用'../'返回一個目錄來包含文件或相對於腳本的文件。 – Xorifelse