[英]Caching dynamic image generated on php
我的php腳本在其他網站上解析用戶的個人資料,獲取一些信息,並為某個用戶生成.png圖像(script.php?username =)。 每次加載這些圖像的頁面時,腳本會一次又一次地運行。 如果更改了輸出的信息,我該如何緩存圖像並僅再次運行腳本? 它可以節省相當多的資源。
將映像緩存到磁盤並讓Apache處理剩下的事情。
首先,重做您的圖像URI,使它們類似於:
<img src="/images/profiles/johnsmith.png" />
然后,在/images/profiles/
,放置一個.htaccess
文件:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.png$ /script.php?username=$1 [QSA,L]
</IfModule>
然后讓您的腳本將生成的png寫入磁盤,然后再將其提供給用戶。 下次請求圖像時,它將直接從Web服務器獲取。
當用戶的配置文件信息發生更改時,只需從服務器中刪除現有的.png文件,您的腳本將在下次請求映像時運行。
如果您不希望Web服務器能夠在Web根目錄中寫入,請在其外部寫入並讓cron作業移動它們。
緩存圖像可能是最容易解決的緩存問題,因為它只是在生成后將任何圖像的本地副本保存到服務器並在運行生成它的代碼之前檢查本地副本。
就像是:-
if(file_exists(image12345.png && !checkIfDataChanged()){
serve cached file;
} else {
generate new file;
save new file to image12345.png;
serve cached file;
}
這個偽代碼,但它應該很容易將它翻譯成PHP。
設置php標頭以通知瀏覽器資源被緩存:
header("Last-Modified: " . date("D, d M Y H:i:s", getlastmod()));
在這里,你可以找到如何使用PHP緩存圖像。 當您從數據庫中找到更新時,可以調用這些腳本,否則每次都將從緩存加載圖像。
// put this above any php image generation code:
session_start();
header("Cache-Control: private, max-age=10800, pre-check=10800");
header("Pragma: private");
header("Expires: " . date(DATE_RFC822,strtotime(" 2 day")));
https://dtbaker.net/blog/web-development/2009/06/how-to-cache-images-generated-by-php/
您需要在每個請求中再次解析用戶的配置文件,以確定是否有更改。
然后,您可以將所有信息放入某種哈希值,如md5($name.$location)
,並將此信息存儲在任何位置。 如果您現在獲得圖像請求,請解析用戶的配置文件,再次創建哈希並查看此哈希值。 如果您已經存儲它,您之前創建了圖像並可以輸出它。 如果哈希值不同,用戶的信息也會發生變化,您將不得不重新創建圖像。
您還可以應用一些啟發式操作,例如用戶每小時只能更改一次配置文件,甚至每天只更改一次。 通過此假設,您可以比較用戶圖像的創建日期,並僅在圖像超過一小時(或一天)時解析用戶的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.