2009-06-13 34 views
0

我似乎有一個奇怪的錯誤,我只是無法弄清楚。我的網站正在一臺服務器上工作,但是當我將它轉移到一臺新服務器上時,它停止工作。我相信我已經縮小了誤差降低到這行代碼:move_uploaded_file掛起?

$ret = move_uploaded_file($tmp_name, $orig_path); 

這是通過AJAX調用所以這是一個有點棘手調試執行,但該腳本可以發送回一個錯誤代碼,然後我的JavaScript會將alert它。所以,我把它包在其中兩個調試語句:

echo json_encode(array(

    'success' => false, 

    'errno' => $tmp_name.' -> '.$orig_path, 

)); 

exit; 



$ret = move_uploaded_file($tmp_name, $orig_path); 



echo json_encode(array(

    'success' => false, 

    'errno' => 'no error', 

)); 

exit; 

第一個工作正常,並吐出類似:

error /tmp/phpk3RICU -> /home/username/Websites/website/photos/o/2-4a3354dd017a9.jpg 

也許我是有點linux的小白,但我實際上在我的系統上找不到/tmp/phpk3RICU(腳本退出後立即刪除它,或者是什麼?)。儘管更多關於這一點。

如果我刪除第一個調試檢查並讓move_uploaded_file運行,第二個調試檢查似乎從未被執行,這導致我相信move_uploaded_file掛起。

如果不使用$tmp_name我使用的文件我知道不存在,那麼第二次檢查DOES得到執行。所以......它似乎只是不想移動該tmp文件,但它不報告錯誤。

我在我的Unbutu機器上運行LAMP堆棧的全新安裝,通過apt-get安裝...讓我知道你是否需要更多信息。

哦..並不知道它是否相關,但文件通過flash上​​傳。

+0

mkdir實際上失敗了......似乎不想創建文件,並且不會吐出錯誤。 – mpen 2009-06-13 07:52:56

回答

0

呃。問題在於權限。 755在其他服務器上已經足夠了,但是對於這臺服務器來說似乎不是這樣的......不知道爲什麼,我猜PHP運行在不同的用戶下?我不確定整個權限的工作原理。真正令我驚訝的是,爲什麼mkdirmove_uploaded_file沒有失敗並返回false ...

1

您是否通過AJAX調用上傳文件? 上傳的文件會在您上傳的腳本完成執行後立即刪除 - 這就是爲什麼您無法在/ tmp中找到它的原因。

1

試着告訴PHP吐出所有的錯誤:

error_reporting(E_ALL); 

這可能是因爲被打破它在你的一臺服務器的配置差異。從move_uploaded_file()manual頁:

注:move_uploaded_file()既 安全模式和open_basedir知道。 但是,限制在目標路徑上僅放置 ,因爲允許 移動上傳的文件,其中 文件名可能與此類 限制衝突。 move_uploaded_file() 通過只允許移動通過PHP上傳 的文件來確保此操作的安全性 。