2010-05-12 139 views
24

我正在建立一個圖像共享網站,並希望知道利用PHP動態調整圖像大小和利弊,並有存儲調整大小的圖像。PHP圖像調整大小與存儲調整大小的圖像

哪個更快?

哪一個更可靠?

這兩種方法在速度和性能上的差距有多大?

請注意,無論是哪種方式,圖像通過一個PHP腳本的統計數據,如視圖或如果盜鏈是允許等...所以不像它將成爲圖像的直接鏈接,如果我選擇存儲調整大小的圖像。

我會感謝您的意見或任何有關該主題的鏈接。

+0

很好的問題,我們可以認爲存儲圖像縮略圖是不好的,因爲它會創建重複的圖像,當您備份您的網站時也沒有用的數據。 – baptx 2015-09-07 14:20:18

回答

16

這聽起來像是不成熟的優化。你知道你的網站會有多少用戶?你的服務器會有多少計算量?使用最簡單的(維護方式)選項,即即時調整大小,直到性能成爲問題,然後從中找出要執行的操作。

如果重新調整圖像的服務器端緩存實施某種服務器端緩存(如果它們可能被重複打擊),但我不認爲這需要延長到顯式預渲染的程度。

+0

感謝您的建議。我目前正在緩存所有的縮略圖,因爲在一個頁面中會有許多縮略圖,並且保留了圖片頁面和下載選項的動態調整大小。 – Pablo 2010-05-13 00:18:40

+0

您可以輕鬆構建您自己的Resizer應用程序,查看此回購:https://github.com/sadok-f/flyimg – 2017-01-03 23:09:33

22

根據圖像的初始大小,動態調整大小可能是一個代價高昂的過程(按時間)。我已經在生產系統中完成了它,但是當我有選擇的時候,我非常喜歡緩存到磁盤。畢竟,磁盤空間很便宜,並且加載時間就是Web上的所有內容。即使您只是以特定大小緩存縮略圖並在其他地方動態調整大小,您也可以大大減少圖庫式圖像列表的加載時間。

+0

您是對的,我的現場主機上有400GB可用。我想我會存儲所有調整大小的圖像。感謝分享。 – Pablo 2010-05-13 00:37:48

15

我強烈建議你緩存你的圖像,而不是動態調整大小。

調整圖像大小非常耗費CPU和內存消耗爲您的服務器。

如果您有一個圖片庫可以實時縮放,頁面會緩慢加載圖片,例如3-10秒,取決於原始文件大小。

調整大小時,需要佔用大約3個字節的內存像素。所以,如果你有一個1000x1000的圖像被調整大小,它將需要大約3MB的內存。如果您的一個網頁上有許多這些動態調整大小的圖片,比如說20,那麼您的服務器大約需要60MB的內存。 也許不是,因爲大多數客戶端當時只需要4張圖片,但12MB對於頁面加載仍然很重要。如果源圖像小於100x100像素,我只能進行縮放。

提示:縮放和保存大拇指一個偉大的lib是PhpThumb

+0

感謝您的輸入,即時將圖像存儲在文件系統中。 – Pablo 2010-05-13 00:46:47

28

這絕對是無與倫比的事項。

動態調整圖像大小,實際上就像在自己的服務器上運行DoS攻擊一樣。調整一個常規圖像的大小需要比爲php腳本提供一個常見請求更多的CPU和RAM。這對性能產生了巨大的影響。然而,通常的縮略圖並不是孤立的,而是數字。因此,雖然只顯示一個圖庫頁面,但您正在創建數十個重負載進程,從而將服務器負載增加了十倍或更多。

快速和骯髒的測試,以證明我的話: 讓我們嘗試調整相對較小,1,3萬像素的圖像

$ /usr/bin/time --format="%MK mem %Es CPU time" /usr/bin/convert angry_birds_1280x800.jpg -resize 100x100 thumb.jpg 
10324K mem 0:00.10s CPU time 

我們花了0,1s,因此,表現出10個圖像預覽會吃一個整整一秒的CPU時間。雖然正確書寫的PHP畫廊頁面大約需要0.01秒。因此,隨着您的調整大小,您將服務器負載增加了100倍。

與內存相同。每個調整大小的過程將會消耗不少於10M的內存(調整一個100k圖像文件的大小!),總共爲100M。儘管PHP腳本通常的內存限制僅爲8M,並且很少達到。

這就是現實生活中的數字。

與此問題相關

一個有些有趣的事:
完全一樣的PHP用戶誰扔容易的CPU週期之外1000000s同時是令人難以置信的嫉妒不遺餘力1或2!這不是一個數字,這裏是我正在談論的一個例子:
A similar question從某人,其高度關注在同一時間作爲可忽略的東西speed difference between Constants, Variables or Variable Arrays。誰最近run into allowed memory size exhausted problem,好像這樣的災難是不夠的。

這個網站上有大量的問題和答案,討論任何操作的納秒速度差異,以無盡的尊嚴回答,運行數百萬次迭代的測試,以顯示幾個CPU週期的一次性操作之間的完全可以忽略的差異。

同時也有類似的問題 - 關於兩種方法之間在性能方面的巨大的,無與倫比的差異,這與兩位作者看似平等。

這是一般PHP用戶和本網站的問題。
前者根本沒有辦法從微觀角度講真實的東西。
然而後者沒有對問題進行完整性檢查的機制 - 即使兩個問題彼此矛盾(並且都有常識),每個人都以同樣的熱情回答。

+0

OP的問題本身只是問哪種方式更好,當然,事先調整圖像大小並存儲它們的大小是一個巨大的性能提升和無與倫比的事情。不包括在使用實時方法時,調整同一圖像兩次(至少)的大小是您可以獲得的最差性能。但是,如果運行中的圖像調整大小服務與前面的某個CDN一起使用,那麼每個圖像都會緩存起來,這可能是一個非常好的選擇。實際上,我可能會說這是將調整大小的圖像存儲到磁盤的懶惰版本。 – eAbi 2015-06-21 20:51:31