2009-07-27 33 views
26

我試圖在PHP中即時生成存檔並立即將其發送給用戶(不保存它)。我認爲不需要在磁盤上創建文件,因爲我發送的數據並不是永久的,但是,在搜索網頁時,我無法找到如何。我也不關心文件格式。用PHP處理內存中的存檔(不在磁盤上創建臨時文件)

所以,問題是:

是否可以創建和操作一個PHP腳本內存儲器中的文件歸檔,而無需創建沿途臨時文件?

+0

該存檔文件是否只包含一個文件或多個文件? – VolkerK 2009-07-27 17:04:41

+0

在我的具體情況下,它包含多個。 另外我會認爲,「任意」大型檔案(項目明智)的解決方案更有趣(在我的情況下,我可以使用臨時文件,但那些必須使用服務器,他們訪問文件系統受限制)? – ralokt 2009-07-28 06:58:03

回答

42

我有同樣的問題,但終於找到了一個有點晦澀的解決方案,並決定在這裏分享。

我來到與phpmyadmin並位於「庫」目錄中的偉大zip.lib.php/unzip.lib.php腳本。

使用zip.lib.php擔任魅力對我來說:

require_once(LIBS_DIR . 'zip.lib.php'); 

... 

//create the zip 
$zip = new zipfile(); 

//add files to the zip, passing file contents, not actual files 
$zip->addFile($file_content, $file_name); 

... 

//prepare the proper content type 
header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=my_archive.zip"); 
header("Content-Description: Files of an applicant"); 

//get the zip content and send it back to the browser 
echo $zip->file(); 

這個腳本允許拉鍊的下載,而不需要具有文件作爲真正的文件或保存拉鍊本身作爲一個文件。

這是一個恥辱,這個功能不是更通用的PHP庫的一部分。

下面是從phpMyAdmin的源到zip.lib.php文件的鏈接: https://github.com/phpmyadmin/phpmyadmin/blob/RELEASE_4_5_5_1/libraries/zip.lib.php

UPDATE: 務必從zip.lib.php的開始,因爲否則腳本只是刪除下列檢查終止:

if (! defined('PHPMYADMIN')) { 
    exit; 
} 

UPDATE: 該代碼可從笨項目,以及: https://github.com/patricksavalle/CodeIgniter/blob/439ac3a87a448ae6c2cbae0890c9f672efcae32d/system/helpers/zip_helper.php

3

你用什麼來生成檔案?您可能可以使用流php:// temp或php://內存來讀寫檔案。

http://php.net/manual/en/wrappers.php.php

+1

目前,我使用php zip擴展名,並在我提供下載時編寫一個臨時文件。 我嘗試使用php:// temp wrapper(鑑於它優於php://內存,因爲大量數據,臨時文件是一個好主意,並且主機甚至可以在限制fs訪問時允許使用它。 我遇到了問題,我不得不關閉zipfile,它顯式釋放了php:// temp /中的所有內容(關閉之前和之後從zipfile中讀取給了我0字節)。 無論如何,不用關心我使用的庫,只要它可以工作,當然PHP是內部的優先選擇 – ralokt 2009-07-28 07:10:44

-7

是否真的有性能問題在這裏,還是隻是得罪你的正當性的意義嗎?很多進程都會寫入臨時文件並將其刪除,而且由於緩存的原因,它們通常不會打到磁盤。

關閉時會自動刪除臨時文件。這就是天性。

只有兩種方法可以考慮在內存中創建一個zip文件併爲其提供服務,這兩種方式可能比他們的價值更麻煩。

  • 使用RAM磁盤。
  • 修改ziparchive類以添加一個方法,該方法執行close()方法所做的一切,除了實際上關閉文件。 (或者添加一個leave-open參數來關閉())。
    這可能甚至不可能取決於底層的C庫。
0

您需要使用ZipArchive::addFromString - 如果你使用addFile()實際上並沒有添加文件,直到你去關閉它。 (可怕的錯誤恕我直言,如果你試圖將文件移動到一個zip文件,並在關閉zip文件之前刪除它們......)
addFromString()方法會立即將它添加到存檔中。

相關問題