2009-06-26 117 views
4

這是事情。現在我有這個電子商務網站,人們可以爲他們的產品發送大量圖片。所有的圖像都存儲在亞馬遜的S3。當我們需要縮略圖或其他東西時,如果有S3可用,我會檢查S3。如果不是,我處理一個併發送給S3並在瀏覽器上顯示。每個不同大小的縮略圖都存儲在S3中,並且在每個請求中檢查縮略圖的可用性都是很費錢的。恐怕一旦網站開始獲得更多關注(如果......),我會付出很多。圖像緩存與PHP和S3中的圖像處理

思考替代品時,我考慮只保留S3的原始圖像,並在每次請求時處理圖像。我想象那樣,我會依靠CPU使用率,但是我沒有做出任何基準來看看我能走多遠。問題是,我不會花費錢在S3上存儲更多圖像,並且我可以將所有內容都緩存在用戶的瀏覽器上。我知道這樣做並不安全,所以我在這裏提出這個問題。

您認爲如何?你覺得我可以解決這個問題嗎?

+0

即時處理它可能無法正常工作,因爲到目前爲止,我嘗試過的大多數PHP圖像處理函數都非常耗時。在客戶端調整大小(或僅顯示縮放)可能會起作用,但您必須每次都傳輸完整的有效內容。有沒有什麼辦法可以將調整大小的圖像緩存在服務器上? – Daff 2009-06-26 22:11:37

+0

我正在一個非常小的磁盤大小的slice @ slicehost上運行我的頁面...只有20GB,這不是太小,但我想用它填充圖像並不是一個好主意。他們會在很短的時間內佔用大量的空間,我猜... – 2009-06-26 22:42:33

回答

2

保持的本地緩存:

  1. 哪些圖像是在S3
  2. 最熱門的圖片

然後在這兩種情況下,你有一個本地參考的緩存。如果圖像不在本地緩存中,則可以檢查本地緩存以查看它是否在S3中。保存最流行項目的S3流量,並在檢查不在本地緩存中的項目的S3時節省延遲。

+0

不幸的是,保留每個圖像的本地參考不是我的選擇...也許緩存最常用會有所幫助,但我將不得不限制爲... – 2009-06-28 13:59:21

+0

所以,我已經限制圖像緩存爲1Gb ...到目前爲止已經夠了! tks :) – 2009-08-20 21:32:34

5

我會在上傳時調整大小,並將所有版本存儲在S3中。例如,如果您有較大的圖像(1200x1200〜200kb)並創建3個尺寸調整的版本(300x300,120x120和60x60),則只需添加約16%或32kb(對於我的測試圖像YMMV)。假設你需要存儲一百萬張圖片;那大概多出30 GB,或者每個月增加4.5美元。據Flickr報道,擁有20億張圖片(2007年),每月額外增加約9萬美元,如果你是那麼大的話,不會太差。

另一個主要優勢是您將能夠使用亞馬遜的CloudFront。

3

如果你從S3代理到客戶端(這聽起來像你正在做的),考慮兩個優化:

  1. 在上傳時,一次調整的圖像,並上傳作爲一個包( tar,XML等等)
  2. 將這些圖像包緩存在您的前端節點上。

'圖像包'將減少PUT/GET/DELETE操作的數量,這在S3中不是免費的。如果你有4個圖像大小,你會減少4.

緩存將進一步減少S3流量,因爲我認爲工作流程通常會看到一個縮略圖 - >點擊它的大圖像。

最重要的是,您可以實現一個主動推送到您的網絡節點的「熱圖像」緩存,以便在您使用羣集時預緩存。

此外,我不建議使用Slicehost < - > S3。運輸成本將會殺死你。你應該真的使用EC2來節省大量的帶寬(Money !!)。

如果您不是代理服務器,但是將圖片的客戶S3 URL傳遞給您,您一定要對所有圖片進行預處理。然後,您不必檢查它們,只需將URL傳遞給您的客戶端即可。

每次重新處理圖像都是昂貴的。你會發現,如果你可以假設所有的圖像都被調整大小,你的網絡節點上的工作量就會下降,一切都會加快。由於您沒有發出多個S3請求,因此尤其如此。