Thursday, February 12, 2009

使用 phpThumb 和 .htaccess 来缓存缩略图

使用 phpThumb 和 .htaccess 来缓存缩略图

Oct 20, 03:52 PM

原文:http://mrphp.com.au/code/project/miscellaneous/image-cache-using-phpthumb-and-htaccess

原理:用户访问 your.com/thumbs/images/image.50×50.jpg 这样的网址,脚本生成 your.com/images/image.jpg 的缩略图,并且保存到 your.com/thumbs/images/image.50×50.jpg,下次访问就不用调 PHP 啦。

简介

大约一年以前我碰到了 phpThumb 这个牛掰的脚本,它是个用来缩放图片的开源项目。当然你可以用 GD2 或者 imagemagick(magickwand) 来干同样的事情,但 phpThumb 是专门干这个的。它用起来相当简单:

<img src="phpthumb/phpThumb.php?src=myimage.jpg&w=100&h=100"> 


如果访问量很大的话就撑不住了,因为 apache 要为每个图片的请求去调 PHP 来解析 phpThumb 的代码。尽管 phpThumb 自己有缓存,它还是要调 PHP 来决定是否从缓存里读。



我曾经看见有人用 mod_rewrite 把不存在的图片重定向到一个可以生成缩略图的脚本,以此来解决性能问题:



你需要:




  • Apache


  • mod_rewrite


  • PHP



这些东西通常虚拟主机都有,至于怎么安装就不在本文的讨论范围之内了。



OK,快告诉我怎么弄吧!



上传 phpThumb



从这里下载 phpThumb: http://phpthumb.sourceforge.net/ ,把它上传到 yoursite.com/phpthumb



配置 Mod_Rewrite



新建 yoursite.com/thumbs/.htaccess



<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?thumb=$1 [L,QSA]
</IfModule>


新建缩略图生成脚本:



新建 yoursite.com/thumbs/index.php



view plaincopy to clipboardprint?




  1. $thumb = $_GET[‘thumb’]; 


  2. if (!$thumb) { 


  3. exit; 




  4. //


  5. $thumb_array = explode(’.’,$thumb); 


  6. $image = ‘../’; 


  7. foreach($thumb_array as $k=>$thumb_part){ 


  8. if ($k != count($thumb_array)-2) { 


  9. $image .= $thumb_part . ‘.’; 


  10.     } 




  11. $image = substr($image,0,-1); 


  12. list($width,$height) = explode(‘x’,$thumb_array[count($thumb_array)-2]); 


  13. //


  14. if (file_exists($image)) { 


  15. require(’../phpthumb/phpthumb.class.php’); 


  16. $phpThumb = new phpThumb(); 


  17. $phpThumb->setSourceFilename($image); 


  18. $phpThumb->setParameter(‘w’,$width); 


  19. $phpThumb->setParameter(‘h’,$height); 


  20. //$phpThumb->setParameter(‘far’,‘C’); // scale outside


  21. //$phpThumb->setParameter(‘bg’,‘<span class="caps">FFFFFF</span>’); // scale outside


  22. if ($phpThumb->GenerateThumbnail()) { 


  23. mkdir(dirname($thumb),0777,true); 


  24. if ($phpThumb->RenderToFile($thumb)) { 


  25.             header(‘Location: /thumbs/’.$thumb); 


  26. exit; 


  27.         } 


  28.     } 





$thumb = $_GET[‘thumb’];
if (!$thumb) {
exit;
}
//
$thumb_array = explode(’.’,$thumb);
$image = ‘../’;
foreach($thumb_array as $k=>$thumb_part){
if ($k != count($thumb_array)-2) {
$image .= $thumb_part . ‘.’;
}
}
$image = substr($image,0,-1);
list($width,$height) = explode(‘x’,$thumb_array[count($thumb_array)-2]);
//
if (file_exists($image)) {
require(’../phpthumb/phpthumb.class.php’);
$phpThumb = new phpThumb();
$phpThumb->setSourceFilename($image);
$phpThumb->setParameter(‘w’,$width);
$phpThumb->setParameter(‘h’,$height);
//$phpThumb->setParameter(‘far’,‘C’); // scale outside
//$phpThumb->setParameter(‘bg’,‘FFFFFF’); // scale outside
if ($phpThumb->GenerateThumbnail()) {
mkdir(dirname($thumb),0777,true);
if ($phpThumb->RenderToFile($thumb)) {
header(‘Location: /thumbs/’.$thumb);
exit;
}
}
}


测试一下!



上传一张图片到 yoursite.com/images/myimage.jpg



打开你的浏览器,访问 yoursite.com/thumbs/images/myimage.100×100.jpg



检查 thumbs 目录,应该有个缩略图在那。下次访问就不用调 PHP 啦。

No comments: