我的網絡服務器有問題。什麼PHP擴展將臨時文件寫入到/ tmp文件夾?
我注意到在/ tmp目錄中經常會創建大文件。文件類似於/ tmp/phpUNIQUECODE 但是這些不是上傳的。因爲在我的php.ini的配置是
upload_tmp_dir = /backup/tmp
upload_max_filesize = 300M
post_max_size = 300M
我發現,在/ tmp文件,是由PHP程序同時下載文件(PHP程序讀取TCP套接字文件,並寫入到輸出)寫的。
我閱讀了一些PHP手冊,我看到這是PHP函數tmpfile()。它在/ tmp文件夾中創建臨時文件(即使upload_tmp_dir不同)。但是這個函數並沒有在我的代碼中使用。在我的代碼中,沒有任何內容保存到磁盤。
這是什麼?其他PHP擴展可以在/ tmp文件夾中創建臨時文件嗎?
謝謝。
更新1. 在我的下載函數中,我使用了ob_start和ob_flush函數。在每個4kb的數據發佈到瀏覽器後,ob_flush被調用。
這個問題可以與ob_ *函數相關嗎?
更新2. 我發現在其他服務器上,我執行相同的PHP代碼來下載文件在/ tmp文件夾中沒有臨時文件。所以這必須與php.ini設置或apache設置相關。 另外我發現臨時文件是正在下載的文件的副本。當下載完成後,臨時文件將從/ tmp文件夾中刪除。
更新3. 我隔離了這個問題。我發現這不是下載的問題。這是使用PHP HTTP包裝器讀取文件的問題。 我的文件存儲在亞馬遜S3上。我打開套接字下載文件與
$fh=fopen('http://s3.amazonaws.com/.....');
然後我讀取文件併發送到用戶瀏覽器。我做了一些測試,發現如果我真的從本地源文件,然後一切都很好。臨時文件不會被創建。 另外我測試了其他包裝--FTP和一些自定義包裝(例如,自定義包裝的Dropbox)。一切都很好。
所以這個問題只適用於php http wrapper,並且只能在我的服務器上使用(其他服務器上的相同代碼很好)。
這個簡單的代碼演示了我的問題:
$filepath='http://bucket.s3.amazonaws.com/.....';
$_fp=fopen($filepath,'r');
if ($_fp) {
$i=1;
$total=0;
while (!feof($_fp)) {
$tmpbuf=fread($_fp, 4096);
$total+=strlen($tmpbuf);//this is done only to make downloading slower
if($total>=$i*4194304){
$i++;
sleep(1);//just to make downloading slower
}
}
fclose($_fp);
}
如果我更換行頭
$filepath='/path/to/local/file';
然後一切都很好。臨時文件不是在/ tmp文件夾中創建的
有關這個奇怪問題的任何想法?
幾乎所有東西:這是一個臨時文件夾,你知道嗎?但是,擴展應該在那之後清理。 – KingCrunch
那些看起來像他們可能是你的PHP會話文件。在文本編輯器中打開它,看看你是否看到序列化的會話數據。 –
這些文件實際上是臨時文件,因爲腳本完成時文件已經清理完畢。這些不是會話,因爲文件名以PHP開頭(會話以sess_開頭) –