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

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP用于构建动态网站,其核心功能包括:1.生成动态内容,通过与数据库对接实时生成网页;2.处理用户交互和表单提交,验证输入并响应操作;3.管理会话和用户认证,提供个性化体验;4.优化性能和遵循最佳实践,提升网站效率和安全性。

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。

PHP在数据库操作和服务器端逻辑处理中使用MySQLi和PDO扩展进行数据库交互,并通过会话管理等功能处理服务器端逻辑。1)使用MySQLi或PDO连接数据库,执行SQL查询。2)通过会话管理等功能处理HTTP请求和用户状态。3)使用事务确保数据库操作的原子性。4)防止SQL注入,使用异常处理和关闭连接来调试。5)通过索引和缓存优化性能,编写可读性高的代码并进行错误处理。

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

确认 Nginx 是否启动的方法:1. 使用命令行:systemctl status nginx(Linux/Unix)、netstat -ano | findstr 80(Windows);2. 检查端口 80 是否开放;3. 查看系统日志中 Nginx 启动消息;4. 使用第三方工具,如 Nagios、Zabbix、Icinga。

在云服务器上配置 Nginx 域名的方法:创建 A 记录,指向云服务器的公共 IP 地址。在 Nginx 配置文件中添加虚拟主机块,指定侦听端口、域名和网站根目录。重启 Nginx 以应用更改。访问域名测试配置。其他注意事项:安装 SSL 证书启用 HTTPS、确保防火墙允许 80 端口流量、等待 DNS 解析生效。

可以通过以下步骤查询 Docker 容器名称:列出所有容器(docker ps)。筛选容器列表(使用 grep 命令)。获取容器名称(位于 "NAMES" 列中)。

可以查询 Nginx 版本的方法有:使用 nginx -v 命令;查看 nginx.conf 文件中的 version 指令;打开 Nginx 错误页,查看页面的标题。
