2013-01-08 85 views
3

我的網絡服務器有問題。什麼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文件夾中創建的

有關這個奇怪問題的任何想法?

+0

幾乎所有東西:這是一個臨時文件夾,你知道嗎?但是,擴展應該在那之後清理。 – KingCrunch

+3

那些看起來像他們可能是你的PHP會話文件。在文本編輯器中打開它,看看你是否看到序列化的會話數據。 –

+0

這些文件實際上是臨時文件,因爲腳本完成時文件已經清理完畢。這些不是會話,因爲文件名以PHP開頭(會話以sess_開頭) –

回答

2

作爲神祕的說,它聽起來像php會話,在你的PHP。INI檢查,看的

的session.save_path

附加價值----

好了,所以可能不是會議的文件,我重讀你的OP和你額外的意見,如果文件是由腳本創建的,該腳本下載數據,並在腳本完成時清除問題?

另外我會指出upload_tmp_dir的設置是通過HTTP上傳文件(根據默認php.ini中的註釋),所以大概與下載無關。你用什麼代碼下載?該命令是否有設置?

更新

由於在/ tmp文件相匹配的大小和下載文件的時機,然後它看起來就像是操作系統如何存儲文件,同時它正在收集數據。我懷疑這是一件值得擔憂的事,特別是如果這些文件經常是一些演出。很可能,它線軸盤來保存系統RAM

更新2

也許我將其稱爲操作系統是不完全正確的,也許它是在PHP的是選擇了膽量某處名稱/創建tmp文件。我看到它的底線 - 基於你所說的一切 - 就是這裏沒有問題,這就是PHP的工作原理。

其他服務器可能被設置爲在其他地方寫入tmp文件,但是如果沒有實際提供用於檢查的代碼段,我不會看到任何人都可以幫助您獲得更多詳細信息。

這些tmp文件導致你什麼問題?

+0

會話文件實際上保存到/ tmp文件夾。但會話文件名稱是/ tmp/sess_CODE,會話文件很小。所以,這不能是會話文件問題。這是不同的。 –

+0

編輯瞭解更多細節 - 答案框比使用評論好得多;) – CodeMonkey

+0

我編輯了我的問題並提供了一些更多詳細信息 –