Discuz贴子打开缓慢的原因分析

Discuz贴子打开缓慢的原因分析

[文章作者:磨延城 转载请注明原文出处: https://mo2g.com/view/139/ ]

前一阵子,就感觉到基于Discuz搭建的会员互动社区打开贴子异常缓慢(响应时间1到10几秒不等),别的页面却是正常的(响应时间200ms左右).浏览一个贴子需要等待好几秒,我自己使用起来都挺上火的,更何况其他活跃的会员?今天就抽出时间,分析导致Discuz贴子打开缓慢的原因.

前一阵子,就感觉到基于Discuz搭建的会员互动社区打开贴子异常缓慢(响应时间1到10几秒不等),别的页面却是正常的(响应时间200ms左右)。浏览一个贴子需要等待好几秒,我自己使用起来都挺上火的,更何况其他活跃的会员?今天就抽出时间,分析导致Discuz贴子打开缓慢的原因。

除了PHP守护进程,正常情况下PHP程序的运行时间不会太慢,基本都是以ms为单位的。如果出现秒级的响应,很多时候都是sql语句不合理导致的。

然而我在MariaDB的慢日志中并没有找到相关的记录,看来只能老老实实的分析Xdebug日志,看看Discuz究竟慢在哪了。

Xdebug日志中显示,/source/module/forum/forum_viewthread.php文件中第284行代码运行了长达10,900ms!

list($seccodecheck, $secqaacheck) = seccheck('post', 'reply');

再往下分析,就找到了/source/class/helper/helper_seccheck.php文件第300行代码$return[0] = captcha::isneed();运行耗时10,571ms,代码如下:

public static function seccheck($rule, $param = array()) {
        global $_G;
        if($_G['uid'] && !checkperm('seccode')) {
            return array();
        }
        if(method_exists('helper_seccheck', 'rule_'.$rule)) {
            $return = call_user_func(array('helper_seccheck', 'rule_'.$rule), $param);
            if(!isset($_G['cookie']['seccloud'])) {
                if($_G['setting']['seccodedata']['cloudip'] && !$return[0]) {
                    $return[0] = captcha::isneed();
                    if($return[0]) {
                        dsetcookie('seccloud', 1);
                    }
                }
            } else {
                $return[0] = true;
            }
            return $return;
        } else {
            return array();
        }
    }

很明显,这条语句是根据条件来判断是否运行的,当看到$_G['setting']['seccodedata']['cloudip']的时候,我突然想起了,好像以前在后台开启了某些“云”功能。

果然,找到Discuz后台的 防水墙->验证码->云端IP库检测,然后选择否,提交保存。现在重新打开贴子,响应时间就恢复到了200ms左右。

Discuz云端IP库检测

云端IP库检测:启用后当用户的登录 IP 在云端可疑 IP 库中时,用户的注册、登录、发表等操作会自动启用验证码。Discuz官方是这么描述这个功能的。

有兴趣的朋友,可以继续往下看,我的跟踪记录。

其实captcha::isneed();就是调用了/source/function/function_filesock.php文件中定义的_dfsockopen()函数,从某个API获取数据。

因为68行代码运行了10,559ms,所以我为了获取导致响应缓慢的API地址,就在68行后添加了一些判断代码

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
$data = curl_exec($ch);
$time = time();
if( $time - $_SERVER['REQUEST']  > 5) {
    echo $scheme.'://'.($ip ? $ip : $host).($port ? ':'.$port : '').$path;
}

运行后,输出类似如下

http://api.discuz.qq.com:80/captcha/isNeed?appId=321122415&clientIp=10.0.0.87&dzVersion=X3.2&openId=44A2245222FE28B91D0D0B969312686E&sId=34707439&uid=2279&ver=1.0&ts=1416967960&sig=eb6a3333d37cc7f556873841732d8d18

所以贴子响应慢,就是因为这个提供IP检测的API接口性能太差导致的。

评论:

  1. vc 回复2015年06月11日 08时09分
    磨者
    我晕了,原来是这个原因,关了之后确实就恢复了,真是感谢您

  2. discuz打开速度 回复2015年06月16日 21时54分
    磨者
    谢谢谢谢谢谢谢谢 解决了

  3. 磨者 778 回复2015年08月27日 00时19分
    磨者
    非常感谢,终于解决了一大问题

  4. 磨者 779 回复2015年08月27日 13时06分
    磨者
    太激动了,今天终于找到解决办法了
    你太厉害了

  5. 磨者 780 回复2015年08月27日 13时09分
    磨者
    感谢,,,,,,感谢,,

  6. 鸡蛋网 回复2015年08月31日 16时31分
    磨者
    刚刚准备开启云端ip库检测,看对防止注册机有没有帮助,看到这篇帖子,我都不敢开启了

  7. 69资源论坛 回复2016年05月19日 00时20分
    磨者
    网站开始建设起来访问很快 过了几天变的很慢了 这个是为什么

  8. 磨者 968 回复2017年09月04日 10时53分
    磨者

  9. 上一页12下一页 共2页

    我来说两句:

      切换  

    磨途歌检测发现,您当前使用的浏览器版本过低,要想使用画板模式,请先更新浏览器

      切换  

    磨途歌随机验证码