如果用戶具有正確的身份驗證,我已經編寫了一個簡單的PHP腳本來下載隱藏文件。整個設置工作正常:它發送正確的標題,並且文件傳輸開始就很好(對於小文件,結束就好了)。通過PHP在Dreamhost上神奇地中斷文件下載
但是,當我嘗試服務一個150 MB文件時,連接在接近文件中間的某個地方被神祕地中斷。下面是相關的代碼片段(從某處在互聯網上採取和改編由我):
function readfile_chunked($filename, $retbytes = TRUE) {
$handle = fopen($filename, 'rb');
if ($handle === false) return false;
while (!feof($handle) and (connection_status()==0)) {
print(fread($handle, 1024*1024));
set_time_limit(0);
ob_flush();
flush();
}
return fclose($handle);
}
我還做一些其他的代碼之前調用上面說的功能,來試圖解決這個問題,但據我可以告訴,它什麼都不做:
session_write_close();
ob_end_clean();
ignore_user_abort();
set_time_limit(0);
正如你所看到的,它不會試圖加載在內存中的整個文件一次或任何瘋狂的那樣。爲了讓它更加令人費解,轉移殺死它的實際點似乎在50到110 MB之間浮動,並且它似乎在幾秒內終止了對同一文件的所有連接(試圖通過嘗試與朋友同時下載)。沒有任何內容添加到中斷文件中,並且我看到日誌中沒有錯誤。
我使用的是Dreamhost,所以我懷疑他們的看門狗可能會因爲運行時間過長而導致我的進程死機。有沒有人有任何經驗分享這個問題?還有其他問題可以解決嗎?有什麼解決方法嗎?
爲了記錄,我的Dreamhost設置爲使用PHP 5.2.1 FastCGI。
有意思。也許你應該將輸出記錄到一個包含運行進程和內存使用情況等統計信息的文件中。可能會有用。 – Hamish 2012-02-21 03:12:06
我會懷疑它要麼是因爲長時間運行而殺死你的進程,要麼是因爲你消耗太多內存而更多的可能是殺死它。 – sberry 2012-02-21 03:12:12