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

代码片段(4)[全屏查看所有代码]

1. [代码]Nginx

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

2. [代码]php产生图片文件

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

3. [图片] QQ截图20120606104850.png

4. [图片] QQ截图20120606104908.png

开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

相关的代码(529)

显示所有 »

发表评论 回到顶部网友评论(15)

  • 1楼:开源中国首席大爷 发表于 2012-06-06 11:44 回复此评论
    还好,但是需要修改不少模板文件,也并不算太方便的 
     
  • 2楼:还没有名字 发表于 2012-06-06 12:27 回复此评论
    比较实用
     
  • 3楼:SimonXia 发表于 2012-06-06 15:50 回复此评论

    引用来自“wwwxxxfr”的评论

    还好,但是需要修改不少模板文件,也并不算太方便的 

    这最可取的地方是: 1.后台上传的时候,不要预产生一系列的不同大小的图片.预产生的图片,可能90%是没有用处的. 2.更改UI的时候,可以任意产生你需要的大小的图片.比较灵活,不用轮询数据库,将所有图片都压缩一遍.

     
  • 4楼:pjiaxu.com 发表于 2012-06-09 20:31 回复此评论
    这个牛X,学习了。
     
  • 5楼:cevin 发表于 2012-06-17 01:26 回复此评论
    +1
     
  • 6楼:HDR 发表于 2012-06-20 16:05 回复此评论

    引用来自“SimonXia”的评论

    引用来自“wwwxxxfr”的评论

    还好,但是需要修改不少模板文件,也并不算太方便的 

    这最可取的地方是: 1.后台上传的时候,不要预产生一系列的不同大小的图片.预产生的图片,可能90%是没有用处的. 2.更改UI的时候,可以任意产生你需要的大小的图片.比较灵活,不用轮询数据库,将所有图片都压缩一遍.

    这种方法很实用。以前也有过类似的想法,可惜一直没有去做

     
  • 7楼:廿九 发表于 2012-06-21 10:33 回复此评论
    支持一下
     
  • 8楼:童冠 发表于 2012-06-28 12:43 回复此评论
     
  • 9楼:moqidian 发表于 2012-08-06 16:11 回复此评论
    好东西
     
  • 10楼:阿城守候 发表于 2013-01-29 14:23 回复此评论
    能不能截服务器屏幕的图,效果跟主机屋的VPS一样捏

     
     
  • 11楼:蚂蚁浩 发表于 2013-03-20 16:38 回复此评论
    最好处理服务器和图片的服务器能分开会比较好 ,另外用php处理我总觉得太笨了 呵呵
     
  • 12楼:wooops 发表于 2013-03-25 00:53 回复此评论

    引用来自“蚂蚁浩”的评论

    最好处理服务器和图片的服务器能分开会比较好 ,另外用php处理我总觉得太笨了 呵呵

    有什么好办法?

     
  • 13楼:蚂蚁浩 发表于 2013-03-25 14:26 回复此评论

    引用来自“wooops”的评论

    引用来自“蚂蚁浩”的评论

    最好处理服务器和图片的服务器能分开会比较好 ,另外用php处理我总觉得太笨了 呵呵

    有什么好办法?

    前台一个nginx 后台一台nginx 前台遇到缩率图请求 使用proxy转发到后台nginx 用filter 处理, 同时在前台做缓存,这样对后台服务器的要求不会很高. 而且也相当灵活

     
  • 14楼:oopul 发表于 2013-08-24 11:04 回复此评论
    Nginx+Nginx Image Thumb Module  http://www.oschina.net/p/ngx_image_thumb
     
  • 15楼:H_Charles 发表于 2014-08-11 17:07 回复此评论
    好想法

《转》使用nginx和php实时产生缩略图的更多相关文章

  1. nginx实时生成缩略图到硬盘上

    现在随着各终端的出现(手机,ipad等平板),以及各种终端的手机分辨率和尺寸都不同,现在手机用户流量都是宝,网上出现了各种各样的生成缩略图功能的架构,有使用php实时生成缩略图的,也有用nginx + ...

  2. nginx实现本地图片生成缩略图

    nginx可以实现图片的缩略图效果,很多网站为了前端静态资源相应的性能会给大图自动生成一个小图,比如我们经常会在网上看到bd_64x64.png这种格式,淘宝上的小图经常会看到xxx.jpg_100x ...

  3. 如何安装nginx_lua_module模块,升级nginx,nginx-lua-fastdfs-GraphicsMagick动态生成缩略图,实现图片自动裁剪缩放

    如何安装nginx_lua_module模块,升级nginx,nginx-lua-fastdfs-GraphicsMagick动态生成缩略图,实现图片自动裁剪缩放 参考网站:nginx-lua-fas ...

  4. 转载:通过监控Nginx日志来实时屏蔽高频恶意访问的IP

    通过监控Nginx日志来实时屏蔽高频恶意访问的IP   目前在我的VPS上主要通过两种方式来限制ip的访问次数. 通过Nginx的limit_req配置来限制同一ip在一分钟内的访问次数 通过Ngin ...

  5. fastdfs+nginx+image_filter安装与生成缩略图

    fastdfs简介 类似google FS的一个轻量级分布式文件系统,纯C实现,支持linux.FreeBSD等UNIX系统: 只能通过API访问,不支持POXIS: 文件不分块存储,上传的文件和OS ...

  6. nginx利用image_filter动态生成缩略图

    转自:http://www.nginx.cn/2160.html "我如今是有些图片须要生成缩略图.这个如今加了image_filter这个已经实现了.但我不知道怎么样才干訪问我上传的原图& ...

  7. 使用 ffmpeg nginx rtmp 搭建实时流处理平台

    环境: ubuntu 16.04 问题引入: 使用 opencv 获取摄像头数据帧, 进行处理之后(如进行 keypoint 识别), 将 opencv 中图像的 Mat类型转化为 ffmpeg 的 ...

  8. ffmpeg+nginx截取屏幕实时画面并进行rtmp推流在前端播放

    准备环境和文件 1.下载ffmpeg的包[https://foxbaby.lanzoui.com/iYjPmup51cd] 地址:https://ffmpeg.org/download.html#bu ...

  9. 通过监控Nginx日志来实时屏蔽高频恶意访问的IP

    目前在我的VPS上主要通过两种方式来限制ip的访问次数. 通过Nginx的limit_req配置来限制同一ip在一分钟内的访问次数 通过Nginx deny封禁一天内超过指定次数的ip(需要一个监控脚 ...

随机推荐

  1. Maven引入Hadoop依赖报错:Missing artifact jdk.tools:jdk.tools:jar:1.6

    Maven引入Hadoop依赖报错:Missing artifact jdk.tools:jdk.tools:jar:1.6 原因是缺少tools.jar的依赖,tools.jar在jdk的安装目录中 ...

  2. Eclipse中src/main/resources配置文件启动问题

    项目pom文件有做修改如下的时候,还没有进行mvn clean install 启动test项目中的appcontext会 可以手动清空 然后就可以了. 出现如下问题的原因是 配置文件默认输出到tar ...

  3. 使用Powermock和mockito来进行单元测试

    转载:http://blog.csdn.net/u013428664/article/details/44095889 简介 Mockito是一个流行的Mocking框架.它使用起来简单,学习成本很低 ...

  4. C#面试:抽象类与接口

    本人近日面试遇到此等问题.然后又一次补习了一下下.希望对同行们有所帮助. 一.抽象类:       抽象类是特殊的类,仅仅是不能被实例化:除此以外.具有类的其它特性:重要的是抽象类能够包括抽象方法,这 ...

  5. 身份证实名认证接口调用实例(PHP)

    基于php的身份证实名认证接口调用代码实例,身份证实名认证接口申请:https://www.juhe.cn/docs/api/id/103 <!--?php // +-------------- ...

  6. ios控件自定义指引

    转载自:http://bbs.9ria.com/thread-256747-1-1.html 一直以来都想写点什么,做点有意义的事,从今天开始我将会把自己在这一年的学习和应用IOS开发中的学习心得和体 ...

  7. Axure教程:滑动进度条、圆形进度环的复杂交互效果实现方法

    滑动条.进度条.进度环,是产品原型中比较常见的进度展示功能.今天笔者分享的是使用Axure原型工具实现两种进度展示功能中相对复杂的交互效果. 效果一.可拖动.可显示进度值.可计算多个页面均值的滑动进度 ...

  8. Linux在中国正在走向没落

    在中国,Linux正在走向没落,一片萧条景象. 在这样的大背景下.居然有人愿意接手中科红旗,令人佩服! 在中国,没有一个关于国际Linux的官方刊物(或站点)反映国际Linux运动的真实声音.Linu ...

  9. 基于RedHat发行的Apache Tomcat本地提权漏洞

    描述 Tomcat最近总想搞一些大新闻,一个月都没到,Tomcat又爆出漏洞.2016年10月11日,网上爆出Tomcat本地提权漏洞,漏洞编号为CVE-2016-5425.此次受到影响的主要是基于R ...

  10. Codeforces 558(C、D、E)总结

    558C 题意:给你n个数,可对每一个数进行操作(乘2或者除以2).求最少的操作使得全部的数都相等. 思路 : dp[ t ] 表示全部的数转化到 t 所需的最少操作, vis[ t ] 表示有多少数 ...