2011-11-22 102 views
2

我有一個php腳本作爲隨機圖像生成器。腳本在數據庫中查詢用戶的圖像,並隨機將路徑返回到一個。一旦路徑被選擇,這裏是負責返回圖像的部分代碼。如何通過php腳本加載圖像緩存

header('Content-Transfer-Encoding: binary'); 
header('Content-Type: image/jpeg'); 
header('Content-Length: ' . filesize($path)); 
echo file_get_contents($path); 

我從客戶端調用它像這樣

image.src = "/database/getRandomImage.php"; 

我每次刷新頁面我隨機得到一個新的形象。但是,如果我多次調用getRandomImage.php來排列並排的圖像,它們將全部是相同的圖像。如果我添加一個隨機屬性的電話像這樣

image.src = "/database/getRandomImage.php?path=" + Math.random() * 100; 

圖片變得隨機。我認爲這意味着瀏覽器基於我傳遞的隨機屬性來緩存它們。問題是這個屬性與實際圖像無關。兩張不同的圖像可能會被緩存爲相同的圖像,並且可能無法從緩存中檢索相同的圖像。 getRandomImage.php是否有任何方式通知瀏覽器它正在發回的圖片?

回答

1

爲什麼沒有getRandomImage是一個PHP函數,它返回圖像的路徑。您可以渲染頁面了已填寫隨機圖像路徑。

<img src="<? echo getRandomImage() ?>"> 

然後你可以實際上真正的緩存頭爲你的圖片,和你的帶寬不會被酩酊大醉這麼難。

在頁面渲染時在服務器端執行此操作,而不是在之後執行此操作。之後做的更多的工作,正如你所發現的,也更復雜。

+0

請不要慢請求圖像名稱然後請求圖像? – puk

+0

我想在理論上。但這就是網絡的工作原理。圖像具有特定的URL,可以訪問以下載該圖像數據。如果從數據庫中獲取圖片url真的是一個突破性能問題的交易,那麼你很可能有更大的問題。但是如果你不能使用緩存,因爲你沒有獨特的網址來顯示你的圖片,那麼在他們第一次看到圖片後,它可能會慢得多。 –

+0

它不是從緩慢的數據庫中獲取,而是我擔心的http請求(我想現在已經消失了)。從本質上講任何涉及Ajax是如此之慢,彷彿它需要一秒鐘的3/4剛剛一命嗚呼我與這個解決方案假設設定的圖像,而加載頁面的,這個問題已經不存在 – puk

0

只要randomImage.php重定向到種子版本,如果它不存在。

if (!isset($_REQUEST['seed'])) 
{ 
     header("Location: randomImage.php?seed="+rand()); 
     exit; 
} 

隨意使隨機數發生器更隨機。

+0

我不明白,這與客戶端播種有什麼不同? – puk

1

緩存與PHP腳本無關;它發生在瀏覽器上。

嘗試增加這劇本,嘗試強制瀏覽器不緩存它(從PHP website):

header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past 
+0

如果可以使用緩存版本,我寧願使用它。 – puk

+1

那麼,如果你想要爲多個圖像使用相同的路徑,你不能允許緩存。 –

+0

@Squeegy我明白現在。我會用你的[解決方案](http://stackoverflow.com/questions/8220498/how-are-images-cached-when-loaded-via-php-script/8220703#8220703),而不是 – puk

0

瀏覽器預計同樣會始終代表相同的圖像。我認爲,即使是根本不強制緩存的標頭也不會停止瀏覽器在同一頁面上重新使用圖像。因此,每次調用它時圖像源都是不同的,這非常直觀。

緩存清除可能是您最好的選擇。這意味着像你隨機黑客那裏,雖然有辦法做得更好。例如,將增加的整數附加到當前時間。這樣你永遠不會複製網址。

var count = 0; 
var now = new Date().getTime(); 
imgs[0].src = "/database/getRandomImage.php?" + (count++) + now; 
imgs[1].src = "/database/getRandomImage.php?" + (count++) + now; 
imgs[2].src = "/database/getRandomImage.php?" + (count++) + now; 

但是,實際上,您可能想重新考慮您的策略,因爲聽起來有點可疑。

+0

我不知道我有客戶端的圖像,它們都存儲在數據庫中。我必須先查詢它才能加載它。我只是認爲這將是更快的查詢和一氣呵成檢索圖像,而不是查詢,得到的路徑,然後將其設置爲'img.src =' – puk

+0

鑑於信息的那一點,我添加了另一個答案,可能是更好的。 –