реклама

понеделник, 10 май 2010 г.

Как да не си чупим сървъра с thumbnail-и

Ето и статийка за това как може да правим разни ефекти с картинки или thumbail-и без товарене на сървъра излишно. Усетил съм, че тази тактика помага за запазване на добри отношения с админите.
Обикновено заради оптимизация на скоростта на зареждане от браузър и съответния YSlow рейтинг, пращане на thumbnail-и, watermarking, разни ефекти по картинките и такива благинки ни се налага да слагаме в страниците си показване на картинка през скрипт. Това е много ефективно, но троши процесора. Решението е просто и е в две части:
1. Редактираме леко .htaccess
Options +FollowSymLinks
RewriteEngine On
#Без mod_rewrite не минава
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .? - [S=40]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .? - [S=40]
#Предното при наличен файл не минава в rewrite и се подава направо наличния файл
RewriteRule ^pics/([a-z0-9]*)/(.*)$ /thumb.php?size=$1&fn=$2 [B,L]
#С това правило после ще викаме скрипта за resize
2. Правим малък скрипт за resize на php, който най-общо ще прави resize по параметър за търсена ширина.
$size= intval($_GET['size']);

if (file_exists($_GET['fn'])){
if (!is_dir('pics')){
mkdir('pics');
chmod('pics',0777);
}

if (!is_dir('pics/'.$_GET['size'])){
mkdir('pics/'.$_GET['size']);
chmod('pics/'.$_GET['size'],0777);
}

$p= dirname($_GET['fn']);
$p1= basename($_GET['fn']);

$arr= explode('/',$p);
$pp= '';
foreach ($arr as $value) {
$pp.= '/'.$value;
if (!is_dir('pics/'.$_GET['size'].'/'.$pp)){
mkdir('pics/'.$_GET['size'].'/'.$pp);
chmod('pics/'.$_GET['size'].'/'.$pp,0777);
}
}

$image = $_GET['fn'];
$im = new Imagick();
$im->pingImage($image);
$im->readImage( $image );
$height=$im->getImageHeight();
$width=$im->getImageWidth();

$h= round($height*($_GET['size']/$width));

$im->resizeImage($_GET['size'],$h,Imagick::FILTER_LANCZOS,1);

$im->writeImage( 'pics/'.$_GET['size'].'/'.$_GET['fn'] );

$im->destroy();

$fsize = filesize('pics/'.$_GET['size'].'/'.$_GET['fn']);

$file_path= 'pics/'.$_GET['size'].'/'.$_GET['fn'];


$fsize = filesize('pics/'.$_GET['size'].'/'.$_GET['fn']);

header("Content-Type: image/jpeg", true);
header("Content-Length: " . $fsize, true);
echo file_get_contents($file_path);
}

Скриптът взима за параметър пълен път до оригиналната картинка(от папката на скрипта нататък, де...), та си прави сам нужните папки.

Така... С помощта на mod_rewrite и imagick(GD също става) заменяме гадните два варианта:
<img src="/images/123/try.jpg" width="300"/> или <img src="/thumbs.php?width=300&file=images/123/try.jpg" /> с <img src="/pics/300/images/123/try.jpg" />. Сега ще си натоварим процесора само при първо показване, а няма да генерираме излишен трафик с пускане на изображение 1024х768, което да смалим в браузъра до 300 пиксела ширина. Елементарно е, но е невероятно силно оръжие за добрия web програмист.

Няма коментари:

Публикуване на коментар