2012-03-29 32 views
0

我有這樣的困境很多次 - 我希望一次又一次地調整我腦海中的答案。Php - PRO和CON流VS.寫/緩存

在創建的PHP文件,如* .zip文件,* PDF或任何其他PHP給你兩個操作選項:

  • 寫入到磁盤中。

  • 流與頭直接下載。

事情要考慮的是:

  • 安全性(通常)
  • CPU和服務時間爲文件
  • 文件的完整性
  • 文件更新
  • 任何其他考慮,我沒有列出。

一個實際的例子:

Let's說,我有一個網站下載一個ZIP打包帶圖像。

如果我將zip壓縮 - 它顯然會花費CPU(和時間)。

如果我寫磁盤 - 它可以是安全問題(假定有人能「爬行」的網站,發現該zip文件夾或以某種方式文件,批量下載全部)

如果我寫磁盤,我會還需要檢查zip文件中的文件是否應該更新,另外我還要驗證文件的完整性。無論如何 - 我想聽聽人們在哪些情況下,哪些是最佳實踐或其他洞察力的首選方法。

回答

1

安全無關如果你做得對。只是不要將文件存儲在公共webroot中,否則將您的web服務器配置爲不直接提供這些文件。

就這樣,它取決於你想要什麼。如果您需要一次又一次地提供同一個zip文件,那麼將它壓縮一次並將其寫入磁盤是有意義的,下次您將從該位置開始服務。這是一個簡單的緩存策略。
如果您需要確保您擁有最新版本的zip,請以某種方式對內容進行哈希處理。例如:

  1. 文件列表來壓縮(foo.txt, bar.jpg, baz.doc)
  2. 化妝哈希$hash = md5(foo.txt, bar.jpg, baz.doc)
  3. 如果$hash.zip不存在,創建它
  4. 服務$hash.zip

這是一個典型的緩存策略避免一次又一次地進行昂貴的操作。

+0

你看 - 我已經學會了一些東西 - 我很笨,使用內部CRC - 這需要每次花費CPU打開文件。我使用哈希追加到文件名使它更經濟。你能詳細闡述一下關於安全的「做對」部分 - 我應該考慮什麼? – 2012-03-29 02:24:45

+1

只需不要公開訪問該文件。僅僅因爲你將它寫入磁盤並不意味着任何人都可以下載它。只有將它寫入可公開訪問的webroot *中的磁盤時,情況纔是如此。你可以簡單地把它寫到webroot之外的磁盤上,解決問題。 – deceze 2012-03-29 02:30:04

+0

這是真實的,條件是每個有權訪問的人都可以自由下載所有文件。但是如果我需要在文件到文件的基礎上限制下載呢?只是在權限上提供ONE鏈接將無法解決此問題(除非我錯過了某些內容) – 2012-03-29 02:34:36

1

如果多次下載相同的zip文件,緩存它(在磁盤或其他持久存儲上)是有意義的。如果您將zip內容的散列作爲文件名的一部分(或者您緩存數據的任何標識符),那麼查看您的緩存值是否與您想要提供的值相符是很微不足道的。

如果任何給定的zip文件將只被下載一次,那麼直接流式傳輸更爲合理。

+0

好的 - 但如果文件是相同的例如,但它只需要一個不同的名稱(如追加用戶名或日期) - 將被視爲「一次下載」?以及緩存時的安全性如何? – 2012-03-29 02:17:47