把image server上的圖片都存到memcache

一般來說網站上的靜態檔只會放一些幾乎不會變動的檔案,例如js/css/icons 等等。
例如所有的js以及css檔等等,另外圖片如果是網站上美工的圖片以及小icon也都會放在web server上。但是像使用者上傳的圖片,那種會不斷一直增加的圖片就不會放在網站上,因為那樣網站會越來越肥,若真的放在網站裡面,不僅會有安全性問題,同時也會變得很沒有彈性,所以一般都會將圖片拉出來做image server,用來放置所有上傳的圖片。

但是圖片一旦拉出來做image server之後,原本使用的framework所提供的cache機制就無法使用,所以把圖片存到memory cache這件事需要另外做。可以參考另一篇文章,先把memchached裝起來,再把Imagemagick裝起來。

Memchached裝好後,就可以寫一隻script來做圖片處理,然後在存到memcache,以下只是一隻很簡單的範例。

$m = new Memcache();
$m->pconnect('localhost', 11211);
$width = 'xxx';
$height = 'yyy';
$origin_file = '/app/image/path';
//為了讓每張圖片都擁有不同的鍵值,使用width,height跟圖片路徑當作memcachd的key

if($m->get($width.'_'.$height.'_'.$origin_file)){
header('Content-type:image/jpeg');
echo $m->get($width.'_'.$height.'_'.$origin_file);
}else{
$image = new Imagick($origin_file); //讀取圖片
$image->thumbnailImage(300, 0);
$image->resizeImage($width,$height,Imagick::FILTER_LANCZOS,1);
ob_start();
echo $image;
$m->set($width.'_'.$height.'_'.$origin_file, ob_get_contents(), false, time()+86400);
ob_end_clean();
header('Content-type:image/jpeg');
echo $image;
}

為了讓每張圖片都擁有不同的鍵值,使用width,height跟圖片路徑當作memcachd的key
基本上做法就是當用戶從Client端發request進來要圖片時候,我們把圖片的widht,height跟圖片路徑當作key,
先檢查這張圖片的有沒有存到memcache了,有的話就直接echo出來。
若沒有的話就使用imagemagick做圖片處理,在用ob_start(),ob_get_contents(),ob_end_clear()
來把圖片存到memcache,最後在echo剛剛用Imagemagic處理好的圖片。

以上只是一隻非常簡單的script,真正的script不會是這樣,但已經把基本該說的都說了,僅供參考。

相關文章:
http://www.php.net/memcache
https://www.digitalocean.com/community/articles/how-to-install-and-use-memcache-on-ubuntu-12-04
http://sumitbirla.com/2011/11/how-to-build-a-scalable-caching-resizing-image-server/