DedeCms V5.7 终极性能优化策略
背景:dedecms生成缩略图的原理不够灵活导致缩略图变形,比如后台设置缩略图的尺码为:120*90即为3:2的图片,但是假如内容里的大图尺码为300*300即1:1,这样生成出来的图片就会变形,严重影响网站美观,本文介绍通过修改dedecms生成缩略源码方法解决定问题
打开“include/image.func.php”文件,该文件在dedecms5.6,5.7中所在的目录不一样,5.6中文件在/include/下,5.7中文件在/include/helpers/,如果你懒的找可以直接在网站根目录搜索image.func.php文件
如果你使用的是dedecms5.7,打开目录/include/helpers/找到image.helper.php文件
如果你使用的是dedecms5.6,打开目录/include/找到image.func.php文件
5.7版image.helper.php修改方法
替换
/**
* 缩图片自动生成函数,来源支持bmp、gif、jpg、png
* 但生成的小图只用jpg或png格式
*
* @access public
* @param string $srcFile 图片路径
* @param string $toW 转换到的宽度
* @param string $toH 转换到的高度
* @param string $toFile 输出文件到
* @return string
*/
至
/**
* 获得GD的版本
*
* @access public
* @return int
*/
中间的代码为:
001001
002if ( ! function_exists('ImageResize'))
003002
004{
005003
006 function ImageResize($srcFile,$toW,$toH,$toFile="")
007004
008{
009005
010global $cfg_photo_type;
011006
012if($toFile=="")
013007
014{
015008
016 $toFile = $srcFile;
017009
018}
019010
020$info = "";
021011
022$srcInfo = GetImageSize($srcFile,$info);
023012
024switch ($srcInfo[2])
025013
026{
027014
028 case 1:
029015
030 if(!$cfg_photo_type['gif'])
031016
032 {
033017
034 return false;
035018
036 }
037019
038 $im = imagecreatefromgif($srcFile);
039020
040 break;
041021
042 case 2:
043022
044 if(!$cfg_photo_type['jpeg'])
045023
046 {
047024
048 return false;
049025
050 }
051026
052 $im = imagecreatefromjpeg($srcFile);
053027
054 break;
055028
056 case 3:
057029
058 if(!$cfg_photo_type['png'])
059030
060 {
061031
062 return false;
063032
064 }
065033
066 $im = imagecreatefrompng($srcFile);
067034
068 break;
069035
070 case 6:
071036
072 if(!$cfg_photo_type['bmp'])
073037
074 {
075038
076 return false;
077039
078 }
079040
080 $im = imagecreatefromwbmp($srcFile);
081041
082 break;
083042
084}
085043
086$srcW=ImageSX($im);
087044
088$srcH=ImageSY($im);
089045
090if($srcW<=$toW && $srcH<=$toH )
091046
092{
093047
094 return true;
095048
096}
097049
098//缩略生成并裁剪
099050
100$newW = $toH * $srcW / $srcH;
101051
102 $newH = $toW * $srcH / $srcW;
103052
104if($newH >= $toH)
105053
106{
107054
108 $ftoW = $toW;
109055
110 $ftoH = $newH;
111056
112}
113057
114else
115058
116{
117059
118 $ftoW = $newW;
119060
120 $ftoH = $toH;
121061
122}
123062
124 if($srcW>$toW||$srcH>$toH)
125063
126{
127064
128 if(function_exists("imagecreatetruecolor"))
129065
130 {
131066
132 @$ni = imagecreatetruecolor($ftoW,$ftoH);
133067
134 if($ni)
135068
136 {
137069
138 imagecopyresampled($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
139070
140 }
141071
142 else
143072
144 {
145073
146 $ni=imagecreate($ftoW,$ftoH);
147074
148 imagecopyresized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
149075
150 }
151076
152 }
153077
154 else
155078
156 {
157079
158 $ni=imagecreate($ftoW,$ftoH);
159080
160 imagecopyresized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
161081
162 }
163082
164 //裁剪图片成标准缩略图
165083
166 $new_imgx = imagecreatetruecolor($toW,$toH);
167084
168 if($newH >= $toH)
169085
170 {
171086
172 imagecopyresampled($new_imgx,$ni,0,0,0,($newH - $toH)/2,$toW,$toH,$toW,$toH);
173087
174 }
175088
176 else
177089
178 {
179090
180 imagecopyresampled($new_imgx,$ni,0,0,($newW - $toW)/2,0,$toW,$toH,$toW,$toH);
181091
182 }
183092
184 switch ($srcInfo[2])
185093
186 {
187094
188 case 1:
189095
190 imagegif($new_imgx,$toFile);
191096
192 break;
193097
194 case 2:
195098
196 imagejpeg($new_imgx,$toFile,85);
197099
198 break;
199100
200 case 3:
201101
202 imagepng($new_imgx,$toFile);
203102
204 break;
205103
206 case 6:
207104
208 imagebmp($new_imgx,$toFile);
209105
210 break;
211106
212 default:
213107
214 return false;
215108
216 }
217109
218 imagedestroy($new_imgx);
219110
220 imagedestroy($ni);
221111
222}
223112
224imagedestroy($im);
225113
226return true;
227114
228}
229115
230}
修改好后保存文件即可,赶紧添加个带图片的文章试试吧,如果你不愿意修改可直接
5.6版image.func.php修改方法
替换
//缩图片自动生成函数,来源支持bmp、gif、jpg、png
至
//获得GD的版本
中间的代码为:
001001
002function ImageResize($srcFile,$toW,$toH,$toFile="")
003002
004{
005003
006global $cfg_photo_type;
007004
008if($toFile=="")
009005
010{
011006
012 $toFile = $srcFile;
013007
014}
015008
016$info = "";
017009
018$srcInfo = GetImageSize($srcFile,$info);
019010
020switch ($srcInfo[2])
021011
022{
023012
024 case 1:
025013
026 if(!$cfg_photo_type['gif'])
027014
028 {
029015
030 return false;
031016
032 }
033017
034 $im = imagecreatefromgif($srcFile);
035018
036 break;
037019
038 case 2:
039020
040 if(!$cfg_photo_type['jpeg'])
041021
042 {
043022
044 return false;
045023
046 }
047024
048 $im = imagecreatefromjpeg($srcFile);
049025
050 break;
051026
052 case 3:
053027
054 if(!$cfg_photo_type['png'])
055028
056 {
057029
058 return false;
059030
060 }
061031
062 $im = imagecreatefrompng($srcFile);
063032
064 break;
065033
066 case 6:
067034
068 if(!$cfg_photo_type['bmp'])
069035
070 {
071036
072 return false;
073037
074 }
075038
076 $im = imagecreatefromwbmp($srcFile);
077039
078 break;
079040
080}
081041
082$srcW=ImageSX($im);
083042
084$srcH=ImageSY($im);
085043
086if($srcW<=$toW && $srcH<=$toH )
087044
088{
089045
090 return true;
091046
092}
093047
094//缩略生成并裁剪
095048
096$newW = $toH * $srcW / $srcH;
097049
098 $newH = $toW * $srcH / $srcW;
099050
100if($newH >= $toH)
101051
102{
103052
104 $ftoW = $toW;
105053
106 $ftoH = $newH;
107054
108}
109055
110else
111056
112{
113057
114 $ftoW = $newW;
115058
116 $ftoH = $toH;
117059
118}
119060
120 if($srcW>$toW||$srcH>$toH)
121061
122{
123062
124 if(function_exists("imagecreatetruecolor"))
125063
126 {
127064
128 @$ni = imagecreatetruecolor($ftoW,$ftoH);
129065
130 if($ni)
131066
132 {
133067
134 imagecopyresampled($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
135068
136 }
137069
138 else
139070
140 {
141071
142 $ni=imagecreate($ftoW,$ftoH);
143072
144 imagecopyresized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
145073
146 }
147074
148 }
149075
150 else
151076
152 {
153077
154 $ni=imagecreate($ftoW,$ftoH);
155078
156 imagecopyresized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
157079
158 }
159080
160 //裁剪图片成标准缩略图
161081
162 $new_imgx = imagecreatetruecolor($toW,$toH);
163082
164 if($newH >= $toH)
165083
166 {
167084
168 imagecopyresampled($new_imgx,$ni,0,0,0,($newH - $toH)/2,$toW,$toH,$toW,$toH);
169085
170 }
171086
172 else
173087
174 {
175088
176 imagecopyresampled($new_imgx,$ni,0,0,($newW - $toW)/2,0,$toW,$toH,$toW,$toH);
177089
178 }
179090
180 switch ($srcInfo[2])
181091
182 {
183092
184 case 1:
185093
186 imagegif($new_imgx,$toFile);
187094
188 break;
189095
190 case 2:
191096
192 imagejpeg($new_imgx,$toFile,85);
193097
194 break;
195098
196 case 3:
197099
198 imagepng($new_imgx,$toFile);
199100
200 break;
201101
202 case 6:
203102
204 imagebmp($new_imgx,$toFile);
205103
206 break;
207104
208 default:
209105
210 return false;
211106
212 }
213107
214 imagedestroy($new_imgx);
215108
216 imagedestroy($ni);
217109
218}
219110
220imagedestroy($im);
221111
222return true;
223112
224}
------------恢复内容开始------------
能同时满足所有用户的需求的,在以往,不少人对DedeCms性能问题表示怀疑,因此本人在此发布一篇关于如何对性能进行优化的文章,并提供最终优化效果测试结果。

一、修改系统参数
在 DedeCms V5.3中,涉及生成HTML性能的主要有下面几个参数:
1、核心设置:
关键字替换(是/否)使用本功能会影响HTML生成速度(cfg_keyword_replace)
这个参数默认是开启的,建议文章是采集的用户不要开启此选项,因为采集的文章必须涉及自动生成关键字问题,这样不少关键字毫无意义,甚至会有乱码导致生成中断,所以建议把这个参数给关闭。
2、性能选项:
调用缓存更新时间(秒,0表示不启用): 10000 cfg_index_cache
是否启用模板缓存: 是 cfg_tplcache
这两个参数相当有意义,在 DedeCms 中,最影响性能的标签是 arclist 这个标签,此外模板缓存是否开启也相当重要,这两个选项就是处理这些问题的。
系统参数具体推荐修改如下图:
二、优化数据库
1、 dede_archives
这个表有 PRIMARY、sortrank、mainindex、lastpost ,四组索引,实际上因为这个表本身很少,设置过多的索引反而没多大的必要,由于dedecms里的程序默认都是用sortrank这字段排序的,建议保留PRIMARY、sortrank两个索引,删除mainindex、lastpost,具体操作如下图:
2、dede_arctiny
这个表相当的小,在测试中,7万数据,这个表才占1.5M左右,实际本身就已经相当的小,因此不必建立索引,所以删除下面索引:
经过上面的优化之后,用7万数据左右的教育类文章测试(数据库800M左右),在奔腾E、2G内存、普通SATA硬盘环境中测试,生成速度如下图:
因为DedeCms生成机制前后速度都差不多的,因此速度稳定在每秒 15 篇左右,当然这个数字和用户模板标签调用数量有一定的关系,但按这个速度,每小时可以达到 5万篇以上,这样还是相当理想的。
可能很多站长会问,为什么不测试百万、千万级的数据呢?
实际上,按这个数据量,如果达到百万,数据库将达到10G之巨,千万级的更上100G,像某些CMS吹的已经通过了千万级测试,就让他们去吹吧,100G数据,再加上图片,生成的HTML是什么概念,是这些普通硬盘、奔腾E的机子可以做的事情?因此拿10万级的数据测试更有代表性,对于真正做正规站的人,而且以后确实做得很大了,升级一下硬件应该没什么问题的吧,此外那些在虚拟主机下的用户当然不可能达到这个速度的了,但这可以作为一个性能优化参考性的依据吧。
------------恢复内容结束------------

浙公网安备 33010602011771号