2011-10-30 140 views
2

我試圖運行下面的代碼:使用php is_dir('〜/ tmp')在一臺機器上工作,但不在另一臺機器上工作。爲什麼?

is_dir('~/tmp'); 

在共享LAMP堆棧。它工作正常,並返回TRUE。 (該目錄存在。)當我在本地盒子上運行相同的代碼時(Mac OSX 10.5,運行Zend Server Community Ed),我得到FALSE,這是錯誤的,因爲〜/ tmp存在並且權限設置爲777.

I我想,我在某處丟失了一個服務器指令。

我與PHPINFO檢查,我有(本地和生產):

safe_mode   Off   Off 

safe_mode_exec_dir no value no value 

safe_mode_gid   Off   Off 

safe_mode_include_dir no value no value 

open_basedir no value no value 

所以我認爲我失去了一些東西,但什麼?

[編輯...]一些詳細信息...

運行在我的本地

get_current_user() 

下面給我 '用戶名',這是正確的用戶,其〜/ tmp目錄我想要驗證,但

shell_exec('whoami') 

給我'守護進程'。所以我想我知道我的問題來自哪裏。現在我只需要弄清楚/如何更改在本地運行Web服務器的用戶。

+0

您將使用該目錄來存儲臨時文件(讀取,使用一次然後刪除)? – xmarcos

+0

準確。例如,這是放置調試日誌的地方。 – meriial

+0

你可以使用'sys_get_temp_dir'函數。我會添加一個例子。 – xmarcos

回答

5

你期待~擴大到你的home目錄?我不願意依賴於PHP的內部。 (剛剛在我的Mac上進行了測試,但未展開。)

如果可能,請嘗試將~/tmp更改爲完整路徑名稱(例如/Users/meriial/tmp之類的內容)。

UPDATE:另外,您可以用$_ENV['HOME']取代~如下:

is_dir($_ENV['HOME'] . '/tmp'); 

理想情況下,你會檢查array_key_exists('HOME',$_ENV)回報TRUE第一,採取一些適當的措施(如使用系統臨時目錄)如果沒有。

對於這個問題,正如@xmarcos所指出的那樣,無論使用的是sys_get_temp_dir()還是tempnam(),都可以使用系統臨時目錄。這可能是最便攜的,因此是您最好的選擇。我認爲你也可以這樣做原子臨時文件創建,所以它可能更安全並且不太容易出現競態條件。

+0

是的,我期待〜擴展到我的主目錄。它適用於共享主機Linux機器,但不在我的Mac上。面臨的挑戰是我想寫入〜/ tmp,而沒有在生產和開發機器上使用不同的代碼。 – meriial

+0

我在OSX 10.7.2上,'〜'解析得很好。奇怪的。 – xmarcos

+0

而不是使用'〜',你可以使用'$ HOME'環境變量。 – Trott

2

您確定該目錄存在您的用戶目錄裏面有嗎?

轉到Terminal,並輸入cd ~/tmp。有效嗎?

更新:您可以使用sys_get_temp_dir如果有的話,代碼示例:

$some_log = tempnam(sys_get_temp_dir(), 'some_log');  
var_dump($some_log); 
// will return '/private/var/folders/.../some_logbqzDvg' 
+0

是的,對'sys_get_temp_dir'使用 – meriial

+1

+1。這個問題很可能是因爲PHP作爲一個不同的用戶運行,所以PHP中的「〜」和終端中的「〜」是兩個不同的目錄。 – deceze

1

對於所有虛擬路徑嘗試首先展開它們。這樣做:

var_dump(realpath('~/tmp')); 

,然後看看會發生什麼,
然後嘗試opendir()一下,看看有什麼錯誤就愈大。

+0

啊哈!好建議。事實證明,在我的生產服務器上,is_dir('〜/ tmp')返回TRUE,因爲使用realpath()後發現了目錄/ path/to/working/directory /〜/ tmp。因爲〜/ tmp也存在,所以我假定它正在擴展到主目錄,但事實並非如此。 – meriial

+0

這是否意味着php可以/永遠不會擴展到主目錄? – meriial

+0

@meriial php在這裏做的很少。 PHP在系統中工作,如果系統擴展〜所以PHP會。 –

相關問題