使用PHP和MySQL緩存已調整大小的圖像的最佳方法


Answers

我會以不同的方式來做。

問題:1. PHP提供文件的效率低於它的效率。 2.每次請求圖像時,PHP都必須檢查文件的存在3. Apache比PHP更好。

這裡有幾個解決方案。

你可以在Apache上使用mod_rewrite 。 可以使用mod_rewrite來測試一個文件是否存在,如果是,則改為使用該文件。 這完全繞過了PHP,使事情變得更快。 但是,真正的方法是生成一個應該始終存在的特定URL模式,如果不是,則重定向到PHP。

例如:

RewriteCond %{REQUEST_URI} ^/images/cached/
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule (.*) /images/generate.php?$1 [L]

因此,如果客戶端請求/images/cached/<something>並且該文件不存在,Apache會將請求重定向到/images/generate.php?/images/cached/<something> 。 然後,該腳本可以生成映像,將其寫入緩存,然後將其發送到客戶端。 將來,除了新圖像之外,PHP腳本不會被調用。

使用緩存。 正如另一張海報所說,使用諸如mod_expires ,Last-Modified頭等等來響應有條件的GET請求。 如果客戶端不需要重新請求圖像,頁面加載速度將顯著加快,並且服務器上的加載將減少。

對於你必須從PHP發送圖像的情況,你可以使用mod_xsendfile來減少開銷。 請看阿諾德·丹尼爾斯(Arnold Daniels)關於這個問題的出色博客文章 ,但是請注意他的例子是用於下載的。 要以內聯方式提供圖像,請取出Content-Disposition標頭(第三個標頭()調用)。

希望這有助於 - 我的偏頭痛清理後更多。

Question

使用PHP處理圖像緩存的最佳實踐方法是什麼?

文件名目前存儲在一個MySQL數據庫中,該數據庫在上傳時被重命名為GUID,以及原始文件名和alt標籤。

當圖像被放入HTML頁面時,使用諸如“/images/get/200x200/{guid}.jpg”這樣的URL來完成,該URL被重寫為一個php腳本。 這允許我的設計者指定(大致 - 源圖像可能更小)的文件大小。

然後,php腳本創建一個大小(URL中的200x200)和GUID文件名的散列,如果之前已經生成了文件(TMP目錄中存在散列名稱的文件),則從應用程序TMP目錄中發送該文件。 如果哈希文件名不存在,則它被創建,寫入磁盤並以相同的方式提供,

這是有效的,因為它可能是? (它也支持對圖像加水印,並且水印設置也存儲在散列中,但是這不在這個範圍內)。




似乎偉大的職位,但我的問題仍然沒有解決。 我沒有訪問我的主機提供商的htaccess,所以沒有問題的Apache調整。 是否真的有辦法為圖像設置cace-control標題?




這聽起來像是一個堅實的方式來做到這一點。 下一步可能是超越PHP / MySQL。

也許, 調整你的標題

如果您使用PHP發送MIME類型,您也可以使用“Keep-alive”和“Cache-control”標頭來延長圖像在服務器上的使用期限,並減輕PHP / MySQL的負擔。

另外,也可以考慮使用apache插件進行緩存。 像mod_expires一樣。

哦,還有一件事,你有多少控制你的服務器? 我們是否應該將這個對話限制 PHP / MySQL?




而不是保留文件的地址在數據庫中,我更喜歡在用戶登錄時為文件名添加一個隨機數。對用戶1234而言,類似這樣:image / picture_1234.png?rnd = 6534122341

如果用戶在會話期間提交了一張新照片,我只刷新隨機數。

GUID解決100%的緩存問題。 但是,這種方式使得難以跟踪圖片文件。 使用這種方法,用戶有可能在未來登錄時再次看到相同的圖片。 然而,如果您從十億個數字中生成您的隨機數字,則賠率很低。






Related