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万级的数据测试更有代表性,对于真正做正规站的人,而且以后确实做得很大了,升级一下硬件应该没什么问题的吧,此外那些在虚拟主机下的用户当然不可能达到这个速度的了,但这可以作为一个性能优化参考性的依据吧。

------------恢复内容结束------------

posted @ 2020-10-18 15:12  webcc  阅读(287)  评论(0)    收藏  举报