原来图片服务器采用Windows .net架构,鉴于需求需要生成各种尺寸图片。
流程说明:
用户从Nginx请求对应的图片,判断是否存在_200x300的对应参数,如果没有就直接请求到对应目录的原图,否则继续判断是否在本地已经生成了对应的缓存图片,如果存在返回已经生成过的定制尺寸图片,否则请求PHP动态生成。
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
|
server {
listen 80;
server_name pics.abc.com;
location / {
root
/var/www/html
;
index index.html index.htm index.php;
error_page 500 502 503 504
/50x
.html;
location =
/50x
.html {
root html;
}
location ~ \_(\d+)x(\d+)\.(jpg|png|gif|jpeg|bmp)$ {
//
判断是否定制图
try_files $uri
/temp/
$uri
/get
.php;
//
判断是否已生成过定制图否则转交给
/get
.php
expires 30d;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp)$
{
expires 30d;
}
}
}
|
在/var/www/html我们以只读方式挂载Windows的目录,修改/etc/fstab,添加
1
|
\\192.168.2.3\f$\pics.abc.com\pics
/var/www/html/pics/
cifs ro,username=user,password=pass 1 2
|
然后重启netfs服务,另外执行下面命令,安装依赖的包
1
2
3
|
yum -y
install
samba-client cifs-utils
service netfs restart
chkconfig netfs on
|
生成的缩率图会放到网站目录的temp目录下,如请求的http://pics.abc.com/pics/201604/29/abc_200x300.jpg
则生成的图片放在temp/pics/201604/29/abc_200x300.jpg目录下
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
function
thumb(
$src
,
$width
,
$height
,
$filename
,
$mode
=
'scale'
,
$quality
=
'100'
) {
try
{
$imageValue
=
getimagesize
(
$src
);
$sourceWidth
=
$imageValue
[0];
//原图宽
$sourceHeight
=
$imageValue
[1];
//原图高
$thumbWidth
=
$width
;
//缩略图宽
$thumbHeight
=
$height
;
//缩略图高
$_x
= 0;
$_y
= 0;
$w
=
$sourceWidth
;
$h
=
$sourceHeight
;
if
(
$mode
==
'scale'
) {
if
(
$sourceWidth
<=
$thumbWidth
&&
$sourceHeight
<=
$thumbHeight
) {
$_x
=
floor
((
$thumbWidth
-
$sourceWidth
) / 2);
$_y
=
floor
((
$thumbHeight
-
$sourceHeight
) / 2);
$thumbWidth
=
$sourceWidth
;
$thumbHeight
=
$sourceHeight
;
}
else
{
if
(
$thumbHeight
*
$sourceWidth
>
$thumbWidth
*
$sourceHeight
) {
$thumbHeight
=
floor
(
$sourceHeight
*
$width
/
$sourceWidth
);
$_y
=
floor
((
$height
-
$thumbHeight
) / 2);
}
else
{
$thumbWidth
=
floor
(
$sourceWidth
*
$height
/
$sourceHeight
);
$_x
=
floor
((
$width
-
$thumbWidth
) / 2);
}
}
}
else
if
(
$mode
==
'crop'
) {
if
(
$sourceHeight
<
$thumbHeight
) {
//如果原图尺寸小于当前尺寸
$thumbWidth
=
floor
(
$thumbWidth
*
$sourceHeight
/
$thumbHeight
);
$thumbHeight
=
$sourceHeight
;
}
if
(
$sourceWidth
<
$thumbWidth
) {
$thumbHeight
=
floor
(
$thumbHeight
*
$sourceWidth
/
$thumbWidth
);
$thumbWidth
=
$sourceWidth
;
}
$s1
=
$sourceWidth
/
$sourceHeight
;
//原图比例
$s2
=
$width
/
$height
;
//新图比例
if
(
$s1
==
$s2
) {
}
else
if
(
$s1
>
$s2
) {
//全高度
$y
= 0;
$ax
=
floor
(
$sourceWidth
* (
$thumbHeight
/
$sourceHeight
));
$x
= (
$ax
-
$thumbWidth
) / 2;
$w
=
$thumbWidth
/ (
$thumbHeight
/
$sourceHeight
);
}
else
{
//全宽度
$x
= 0;
$ay
=
floor
(
$sourceHeight
* (
$thumbWidth
/
$sourceWidth
));
//模拟原图比例高度
$y
= (
$ay
-
$thumbHeight
) / 2;
$h
=
$thumbHeight
/ (
$thumbWidth
/
$sourceWidth
);
}
}
switch
(
$imageValue
[2]) {
case
2:
$source
= imagecreatefromjpeg(
$src
);
break
;
case
1:
$source
= imagecreatefromgif(
$src
);
break
;
case
3:
$source
= imagecreatefrompng(
$src
);
break
;
case
6:
$source
= imagecreatefromwbmp(
$src
);
break
;
default
: defulat();
return
;
}
header(
"Content-type: image/jpeg"
);
$thumb
= imagecreatetruecolor(
$width
,
$height
);
imagefill(
$thumb
, 0, 0, imagecolorallocate(
$thumb
, 255, 255, 255));
imagecopyresampled(
$thumb
,
$source
, 0, 0,
$x
,
$y
,
$width
,
$height
,
$w
,
$h
);
imagejpeg(
$thumb
, null,
$quality
);
imagejpeg(
$thumb
,
$filename
,
$quality
);
imagedestroy(
$thumb
);
imagedestroy(
$source
);
}
catch
(Exception
$ex
) {
defulat();
}
}
function
defulat() {
/*
$default_img = realpath('../pictures/nopic.gif');
ob_start();
header('Content-type:image/jpeg');
readfile($default_img);
ob_flush();
flush();
*/
echo
'error'
;
}
function
mkDirs(
$dir
){
if
(!
is_dir
(
$dir
)){
if
(!mkDirs(dirname(
$dir
))){
return
false;
}
if
(!
mkdir
(
$dir
,0755)){
return
false;
}
}
return
true;
}
$uri
=
$_SERVER
[
'REQUEST_URI'
];
$image
=
basename
(
$uri
);
$temp
=
'./temp/'
.dirname(
$uri
).
'/'
;
$imgpath
=
'.'
.dirname(
$uri
).
'/'
;
/*
//检查本地是否存在文件,原图
if(file_exists($temp.$image)){
ob_start();
header('Content-type:image/jpeg');
readfile($temp.$image);
ob_flush();
flush();
exit();
}
*/
//检查生成的图片是否曾经生成过,存在即返回,否则重新生成新图
if
(!preg_match(
'/_(\d+)x(\d+)/'
,
$image
,
$wh
)){
ob_start();
header(
'Content-type:image/jpeg'
);
readfile(
$imgpath
.
$image
);
ob_flush();
flush
();
exit
();
}
$width
=
$wh
[1];
$height
=
$wh
[2];
$source_img
=preg_replace(
'/_(\d+)x(\d+)/'
,
''
,
$image
);
//对长宽都超过的图片返回原图
if
(
$width
>=2000 ||
$height
>=2000){
ob_start();
header(
'Content-type:image/jpeg'
);
readfile(
$imgpath
.
$source_img
);
ob_flush();
flush
();
exit
();
}
//图片处理
$src
=
$imgpath
.
$source_img
;
$filename
=
$temp
.
$image
;
mkDirs(
$temp
);
//thumb(realpath($src), $width, $height, $filename, 'crop', '85');
thumb(
realpath
(
$src
),
$width
,
$height
,
$filename
,
'crop'
,
'100'
);
|
PHP生成尺寸部分参考<PHP图片自动裁切应付不同尺寸的显示>
如果上述服务器出现问题,则降低的Nginx配置为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
server {
listen 80;
server_name localhost;
access_log logs
/host
.access.log main;
location / {
rewrite ^/(.*)\_(\d+)x(\d+)\.(.*)$ /$host/$1 permanent;
rewrite ^/([0-9a-zA-Z]+)/(.*)$ /$host/$1/$2 permanent;
root html;
index index.html index.htm;
}
}
|
本文转自 rong341233 51CTO博客,原文链接:http://blog.51cto.com/fengwan/1769043