2010-05-13 57 views
7

我在php中製作了一個圖片縮放器。調整圖像大小時,會緩存具有新維度的新jpg文件。下一次您確切地調用img.php?file = hello.jpg & size = 400它會檢查新的jpg是否已經創建。調用緩存圖像時效率更高/更快?

  1. 如果它尚未創建,它會創建文件,然後打印輸出(酷)。
  2. 如果它已存在,則不需要生成新文件,而是隻調用已經緩存的文件。

我的問題是關於第二種情況。哪個更快?

  1. 重定向:header('Location: cache/hello_400.jpg');die();
  2. 抓取數據,並打印緩存文件:$data = file_get_contents('cache/hello_400.jpg'); header('Content-type: '.$mime); header('Content-Length: '.strlen($data)); echo $data;

任何其他方式來改善呢?

如果有人想生成的代碼,檢查了這一點: http://egobits.com/misc/img.phps

感謝所有的幫助!

+0

一個很好的問題(我不確定哪個更快)。 – JYelton 2010-05-13 15:46:23

回答

3

有沒有其他方法可以改善這一點?

是的。

有一種方法可以只發送一個HTTP頭:條件獲取。
您可以在類似的腳本,http://shiftingpixel.com/2008/03/03/smart-image-resizer/看一看,爲實現

+0

這工作完美。如果圖像不存在,腳本會創建新的調整大小的圖像並對其進行緩存。下一次請求相同的鏈接時,該腳本將爲瀏覽器緩存的img提供服務。謝謝。 – andufo 2010-05-13 17:15:04

+0

如果有人想要生成的代碼,請查看:http://egobits.com/misc/img.phps – andufo 2010-05-13 20:58:17

+0

您可能想使用readfile()而不是file_get_content,因爲整個文件從未加載到php中,並且直接發送給用戶 – 2010-05-14 15:04:25

5

我會選擇從不將數據打印到瀏覽器。這兩種方案都應該永久重定向到生成的圖像。除非圖像還不存在,否則會在發送位置標題之前創建。

編輯:

只是要清楚什麼,我的意思是通過永久重定向...

header('HTTP/1.1 301 Moved Permanently'); 
header('Location: http://path/to/image'); 
+0

要添加到馬特,它可以緩存瀏覽器到代理服務器的互聯網點上的圖像。 – Rohit 2010-05-13 15:53:16

0

作爲第三(更強大)選項:在二進制字段緩存圖片一個數據庫,併爲它查詢數據庫。

實施所有三種解決方案並對其進行基準測試。

我猜測第一個選項(重定向)在現實世界中是最慢的,因爲它需要和第二個選項(file_get_contents)一樣多的努力,但涉及第二個請求和更多開銷。

5

也許你可以做到以下幾點:

  1. 設置一些目錄,這些圖像。
  2. 鏈接到這個目錄的圖像(<a href="/img/resizable/hello_400.jpg>)。
  3. 設置你的網絡服務器重定向到你的PHP腳本,如果圖像不存在。如果你在Apache上,一個簡單的.htaccess就可以做到。在PHP中,您有$_SERVER["REQUEST_URI"],您可以從中分辨您應調整哪個圖像。
  4. 您的腳本會保存並回應圖像(但僅在第一次調用時)。

這樣,你得到一些好處:

  • 的圖像緩存(在代理或瀏覽器)任何其他靜態文件。
  • PHP不必爲每個請求調用,只是爲了重定向或輸出靜態數據。
  • 您將If-modified-since和其他與緩存相關的標頭的實現留給了Web服務器。
  • 而鏈接看起來更漂亮:-)

例在你的/ IMG /可調整大小的文件夾中的.htaccess:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* /img.php [L] 
+0

+1我同意。儘可能委派給Apache,只在實際需要時調用PHP。 – Matt 2010-05-13 20:20:43

0

如果可能的話,你的情況,你也可以實現一個功能,直接設置緩存的圖像在你的HTML類似的網址:如果存在另外返回的URL,動態GE

<img src="<?php getImageUrl('hello.jpg', 400); ?>" /> 

getImageUrl()將返回緩存圖片的網址整理調整後的圖像。