Nginx配合php實現(xiàn)生成實時縮略圖功能
在做自動靜態(tài)化的時候,突然想到下面這個場景,也給出了解決方法。親,真的很實用,耐心看下去。
當我從后臺上傳一個截圖之后,480*800的截圖之后,當時就沒有壓縮出320*480的小縮略圖。好吧,服務器輪詢一下,全部產(chǎn)生出320*480的圖片。
那下一次呢,又有160*240的圖片了,又輪詢嗎,費時費力,還不能馬上就得到小圖。這個時候,我們就要開始抱怨了,怎么要這么多種圖片啊,設計師,你就不能老早就想好要哪些圖片么?
其實,nginx是一個強大的反向代理服務器,通過它的rewrite模塊,我們可以實現(xiàn)自動產(chǎn)生縮略圖,也不用輪詢數(shù)據(jù)庫了。產(chǎn)品設計,要什么尺寸的,客戶端直接通過某種規(guī)則訪問就是了,我馬上就產(chǎn)生給你。
而且,后臺上傳的時候,只要保存一張最大的圖片就ok了。
這樣的話,需要其他尺寸的圖片,僅僅修改客戶端的訪問方式即可。
Nginx配置:
#假設,服務器上面有一個文件:abc.jpg,通過http://filefs.domain.com/file/abc.jpg能夠訪問到原圖。其#實一般的,我們在數(shù)據(jù)庫里面也就保存了“/file/abc.jpg”這部分內(nèi)容。
#現(xiàn)在,我們要實現(xiàn)通過http://filefs.domain.com/file/abc.jpg.w320.jpg由服務器自動產(chǎn)生#abc.jpg.w320.jpg(w320,320px的寬度)這個縮略圖。并返回圖片數(shù)據(jù)。
#要滿足以下兩個條件:
# 1.如果abc.jpg.w320.jpg存在,則不重新產(chǎn)生圖片
# 2.如果不存在,則在同一次的請求中,返回圖片數(shù)據(jù),和保存圖片文件到服務器。
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到產(chǎn)生圖片的腳本文件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;
}
}
php產(chǎn)生圖片文件代碼:
<?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 ( //只產(chǎn)生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--壓縮質(zhì)量,100表示最高質(zhì)量。
@imagedestroy ( $im );
@imagedestroy ( $dst_img );
} else {
echo @file_get_contents ( $src );
}
$content = ob_get_contents ();//獲取輸出流
ob_end_flush ();//輸出流到網(wǎng)頁,保證第一次請求也有圖片數(shù)據(jù)放回
@file_put_contents ( $des, $content );//保存文件
}
?>
效果圖:
- CentOS下編譯、安裝與配置nginx
- CentOS 7.2 下編譯安裝PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法詳解(mini版本)
- CentOS 7.2.1511 編譯安裝Nginx1.10.1+MySQL5.6.33+PHP5.6.26運行環(huán)境
- CentOS 7.2.1511 編譯安裝Nginx1.10.1+MySQL5.7.14+PHP7.0.11
- CentOS 6.6服務器編譯安裝lnmp(Nginx1.6.2+MySQL5.6.21+PHP5.6.3)
- Centos下編譯安裝Nginx教程詳解
- Nginx服務器中用于生成縮略圖的模塊配置教程
- 在Nginx中配置image filter模塊來實現(xiàn)動態(tài)生成縮略圖
- Nginx生成縮略圖并存儲到硬盤上
- CentOS下編譯安裝nginx及配置縮略圖插件的方法教程
相關文章
Nginx在Windows下的安裝及環(huán)境配置(將nginx作為服務運行)
這篇文章主要介紹了Nginx在Windows下的安裝及環(huán)境配置,主要是將nginx作為服務運行,需要的朋友可以參考下2018-11-11nginx rewrite重寫規(guī)則與防盜鏈配置方法教程詳解
這篇文章主要介紹了nginx rewrite重寫規(guī)則與防盜鏈配置方法教程詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09nginx部署前端項目location時root和alias配置指南
nginx指定文件路徑有兩種方式root和alias,下面這篇文章主要給大家介紹了關于nginx部署前端項目location時root和alias配置的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-01-01nginx訪問日志并刪除指定天數(shù)前的日志記錄配置方法
這篇文章主要介紹了nginx訪問日志并刪除指定天數(shù)前的日志記錄配置方法,需要的朋友可以參考下2014-03-03