堕落不振功业废,勤耕不辍日月新

Discuz!X 2.5抢楼之查看抢中楼层的性能问题

PHP hailen 655℃

论坛部门前几天组织了个抢楼活动,几天下来楼层达到60W,结束后,同事需要对抢中的楼层进行统计。悲剧的是页面无法打开了,Nginx返回了500错误。问题反馈到我这,考虑是否因为数据过多超时造成的,找到相关功能的代码,确实有点问题。

 

问题代码: /source/module/forum/forum_viewthread.php 的382行

for($i = 1; $i <= $_G['forum_thread']['replies'] + 1; $i++) {
	$str = $str.$i.',,';
}
preg_match_all($preg_str, $str, $arr);

上面代码中 $_G[‘forum_thread’][‘replies’] 的值为60多万,程序运行到for循环时导致脚本超时。检查了下上下文,不知道为什么discuz要用正则的方式实现此功能(本人对discuz也是一知半解,完全没咋研究过),不过这不是重点,导致出错的原因在于字符串连接的运算符,关于PHP字符拼接的效率对比可自行Google,我就不再说了。

将上面代码改为

for($i = 1; $i <= $_G['forum_thread']['replies'] + 1; $i++) {
	$str .= $i . ',,';
}
preg_match_all($preg_str, $str, $arr);
$str = null; //此处释放$str内存,实在太大了。。。

问题解决。

转载请注明:我是IT » Discuz!X 2.5抢楼之查看抢中楼层的性能问题

喜欢 (0)or分享 (0)