我試圖在PHP中即時生成存檔並立即將其發送給用戶(不保存它)。我認爲不需要在磁盤上創建文件,因爲我發送的數據並不是永久的,但是,在搜索網頁時,我無法找到如何。我也不關心文件格式。用PHP處理內存中的存檔(不在磁盤上創建臨時文件)
所以,問題是:
是否可以創建和操作一個PHP腳本內存儲器中的文件歸檔,而無需創建沿途臨時文件?
我試圖在PHP中即時生成存檔並立即將其發送給用戶(不保存它)。我認爲不需要在磁盤上創建文件,因爲我發送的數據並不是永久的,但是,在搜索網頁時,我無法找到如何。我也不關心文件格式。用PHP處理內存中的存檔(不在磁盤上創建臨時文件)
所以,問題是:
是否可以創建和操作一個PHP腳本內存儲器中的文件歸檔,而無需創建沿途臨時文件?
我有同樣的問題,但終於找到了一個有點晦澀的解決方案,並決定在這裏分享。
我來到與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
你用什麼來生成檔案?您可能可以使用流php:// temp或php://內存來讀寫檔案。
目前,我使用php zip擴展名,並在我提供下載時編寫一個臨時文件。 我嘗試使用php:// temp wrapper(鑑於它優於php://內存,因爲大量數據,臨時文件是一個好主意,並且主機甚至可以在限制fs訪問時允許使用它。 我遇到了問題,我不得不關閉zipfile,它顯式釋放了php:// temp /中的所有內容(關閉之前和之後從zipfile中讀取給了我0字節)。 無論如何,不用關心我使用的庫,只要它可以工作,當然PHP是內部的優先選擇 – ralokt 2009-07-28 07:10:44
是否真的有性能問題在這裏,還是隻是得罪你的正當性的意義嗎?很多進程都會寫入臨時文件並將其刪除,而且由於緩存的原因,它們通常不會打到磁盤。
關閉時會自動刪除臨時文件。這就是天性。
只有兩種方法可以考慮在內存中創建一個zip文件併爲其提供服務,這兩種方式可能比他們的價值更麻煩。
關於您的評論,除非您關閉它,否則請嘗試保持打開狀態,刷新輸出,然後倒回到0並閱讀。
在這裏尋找更多的例子:http://us.php.net/manual/en/function.tmpfile.php
而且研究成果緩衝和捕獲:http://us.php.net/manual/en/function.ob-start.php
您需要使用ZipArchive::addFromString
- 如果你使用addFile()
實際上並沒有添加文件,直到你去關閉它。 (可怕的錯誤恕我直言,如果你試圖將文件移動到一個zip文件,並在關閉zip文件之前刪除它們......)
addFromString()
方法會立即將它添加到存檔中。
該存檔文件是否只包含一個文件或多個文件? – VolkerK 2009-07-27 17:04:41
在我的具體情況下,它包含多個。 另外我會認爲,「任意」大型檔案(項目明智)的解決方案更有趣(在我的情況下,我可以使用臨時文件,但那些必須使用服務器,他們訪問文件系統受限制)? – ralokt 2009-07-28 06:58:03