2013-03-16 56 views
1

我正在閱讀圖像從最小1x1像素到最大1600x1600像素。我寫了三種PHP方法,並且工作正常。用PHP快速閱讀和輸出瀏覽器中的圖像

// using FGC 
function output_fgc($filename) 
{ 
    header("Content-Type: image/png"); 
    echo file_get_contents($filename); 
} 

// using fopen 
function output_fp($filename) 
{ 
    $handle = fopen($filename, 'rb'); 

    header("Content-Type: image/png"); 
    header("Content-Length: " . filesize($filename)); 

    fpassthru($handle); 
} 

// using GD 
function output_gd($filename) 
{ 
    $im = imagecreatefrompng($filename); 

    header('Content-Type: image/png'); 

    imagepng($im); 
    imagedestroy($im); 
} 

看來所有方法的性能都是一樣的。只是想知道哪些使用更多的服務器資源?有沒有比這更好的方法?提前致謝。

+0

最後一種方法肯定是不必要的資源消耗(除非你想讓10000%超級確定你的文件實際上是一個圖像,但在大多數情況下這將是矯枉過正)。 – 2013-03-16 15:29:13

+0

@Pekka웃,所有圖像都是PNG和保存在服務器中。所以前兩種方法是好的? – 2013-03-16 15:32:58

+0

是的 - 儘管如果你想讓它們被緩存,你必須發送你自己的緩存標題,並且通過PHP發送靜態內容並不是每一種都很有效。爲什麼你不能把原始的PNG放在一個可以訪問網頁的文件夾中的任何具體原因? – 2013-03-16 15:34:24

回答

3

當用戶請求黑白200x100像素圖像佔位符,第一次與GD創建,保存和輸出,如果要求相同的大小下一次,我正在看保存的文件和輸出,而不是建立新的再瀏覽器。

如果你可以使用Apache的mod_rewrite模塊,那麼有一種更高效的方法,一旦創建圖像就完全不需要PHP。從那裏見Create resized image cache but prevent abuse

被盜:

HTML:

<img src="images/cache/200x150-picture_001.jpg" /> 

的.htaccess代碼:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ images/image.php?f=$1 [L] 

這項技術看起來正確的大小/文件名的圖像是否在存在「緩存」文件夾,只有在不存在的情況下,纔會調用您的PHP腳本。您的腳本將不得不解析大小信息(如您所說的200x100),調整大小並輸出圖像。下一次有人請求該映像時,Apache將靜態提供服務,從而節省資源。

唯一的缺點是PHP腳本只會被調用一次,所以如果原始圖像發生變化,更改將永遠不會傳播到調整後的版本。您可能需要偶爾擦除所有調整大小的圖像以防止出現這種情況,或者在原始更改時刪除所有調整大小的圖像。

當使用PHP輸出圖像時,請務必發送緩存信息。見例如How to use HTTP cache headers with PHP

+0

+1爲好答案。這裏'下一次如果請求相同的大小'意味着不是由同一個用戶。不同的用戶每天可以在世界各地要求200x100的位置持有者。你說什麼? – 2013-03-16 15:58:35

+0

@Code這將在下一次如果* any *用戶請求相同大小。該文件將已經在那裏。 – 2013-03-16 16:11:41