當前訪客身份:游客 [ 登錄 | 加入程式開發 討論區 ]
當前訪客身份:未登入或非會員
重裝旅包 重裝旅包
手癢愛寫 給大家新資訊

使用nginx和php实时产生缩略图

發表於(2014-07-14 02:25:52)  閱讀(1353) | 評論(0 0人收藏此文章,
摘要 使用nginx和php实时产生缩略图

在做自动静态化的时候,突然想到下面这个场景,也给出了解决方法。亲,真的很实用,耐心看下去。
 
 
当我从后台上传一个截图之后,480*800的截图之后,当时就没有压缩出320*480的小缩略图。好吧,服务器轮询一下,全部产生出320*480的图片。
那下一次呢,又有160*240的图片了,又轮询吗,费时费力,还不能马上就得到小图。这个时候,我们就要开始抱怨了,怎么要这么多种图片啊,设计师,你就不能老早就想好要哪些图片么?
 
其实,nginx是一个强大的反向代理服务器,通过它的rewrite模块,我们可以实现自动产生缩略图,也不用轮询数据库了。产品设计,要什么尺寸的,客户端直接通过某种规则访问就是了,我马上就产生给你。
而且,后台上传的时候,只要保存一张最大的图片就ok了。
这样的话,需要其他尺寸的图片,仅仅修改客户端的访问方式即可。
 

[全屏查看所有代码]

 

01 #假设,服务器上面有一个文件:abc.jpg,通过http://filefs.domain.com/file/abc.jpg能够访问到原图。其#实一般的,我们在数据库里面也就保存了“/file/abc.jpg”这部分内容。
02 #现在,我们要实现通过http://filefs.domain.com/file/abc.jpg.w320.jpg由服务器自动产生#abc.jpg.w320.jpg(w320,320px的宽度)这个缩略图。并返回图片数据。
03 #要满足以下两个条件:
04 #   1.如果abc.jpg.w320.jpg存在,则不重新产生图片
05 #   2.如果不存在,则在同一次的请求中,返回图片数据,和保存图片文件到服务器。
06  
07  
08 server {
09     listen       80;
10     server_name  filefs.domain.com;
11      
12     root /var/www/http/filefs.domain.com;
13     location / {
14         index  index.html index.htm;
15     }
16      
17     location ~ \.(png|jpg|jpeg|gif)$ {
18         #如果文件不存在,则rewrite到产生图片的脚本文件autoimg.php
19         if (!-f $request_filename) {
20             rewrite ^/.*$ /autoimg.php;
21             expires max;
22         }
23         #如果文件存在,则设置过期时间,关闭访问日志
24         if ( -f $request_filename ) {
25             expires max;
26             access_log off;
27         }
28     }
29      
30     error_page   500 502 503 504  /50x.html;
31     location = /50x.html {
32         root   /usr/share/nginx/html;
33     }
34      
35     location ~ autoimg.php$ {#安全性考虑,文件服务器,只这个脚本文件的范围提交给php处理
36         fastcgi_pass   127.0.0.1:9000;
37         fastcgi_index  index.php;
38         fastcgi_param  SCRIPT_FILENAME  /var/www/http/filefs.domain.com$fastcgi_script_name;
39         include        /usr/local/nginx/conf/fastcgi_params;
40     }
41 }

2. [代码]php产生图片文件     跳至 [1] [2] [全屏预览]

01
02     $file $_SERVER ['REQUEST_URI'];//请求字串 /file/abc.jpg.w320.jpg
03     $desfile $_SERVER ['DOCUMENT_ROOT'] . $file//目标目标路径 /var/www/http/file/abc.jpg.w320.jpg
04     $dirname = dirname ( $desfile ) . "/";
05     $filename basename $desfile );
06     if (preg_match ( "/([^\.]+\.(png|jpg|jpeg|gif))\.w([\d]+)\.(jpg)/i"$filename,$m )) {
07         $srcfile $dirname $m [1];
08         $width $m [3];                    //匹配出输出文件宽度
09         if (in_array ( $widtharray (      //只产生202和320宽度的文件
10                 202,
11                 320
12         ) ) && file_exists $srcfile )) {  //而且文件不存在
13             thumbnail ( $srcfile$desfile$width );
14         }
15     }
16      
17     /**
18      * 生成缩略图
19      *
20      * @param 源 $src           
21      * @param 缩放后的宽带 $width        
22      *
23      */
24     function thumbnail($src$des$width) {
25         ob_start ();//开始截获输出流
26         $imageinfos getimagesize $src );
27         $ext strtolower pathinfo $src, 4 ) );
28         if ($imageinfos [2] == 1) {
29             $im = imagecreatefromgif ( $src );
30         elseif ($imageinfos [2] == 2) {
31             $im = imagecreatefromjpeg ( $src );
32         elseif ($imageinfos [2] == 3) {
33             $im = imagecreatefrompng ( $src );
34         }
35          
36         if (isset ( $im )) {
37             $height $imageinfos [1] * $width $imageinfos [0];
38             $dst_img = ImageCreateTrueColor ( $width$height );
39              
40             imagesavealpha ( $dst_img, true );
41             $trans_colour = imagecolorallocatealpha ( $dst_img, 0, 0, 0, 127 );
42             imagefill ( $dst_img, 0, 0, $trans_colour );
43              
44             imagecopyresampled ( $dst_img$im, 0, 0, 0, 0, $width$height,$imageinfos [0], $imageinfos [1] );
45              
46             header ( 'content-type:image/jpg' );
47             imagejpeg ( $dst_img, null, 90 );//输出文件流,90--压缩质量,100表示最高质量。
48              
49             @imagedestroy ( $im );
50             @imagedestroy ( $dst_img );
51         else {
52             echo @file_get_contents $src );
53         }
54         $content = ob_get_contents ();//获取输出流
55         ob_end_flush ();//输出流到网页,保证第一次请求也有图片数据放回
56         @file_put_contents $des$content );//保存文件
57     }
58 ?>

評論0