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. 撒哈拉的小猫 回复2014年12月12日 12时54分
    磨者
    谷歌被封杀之后,wordpress因为有谷歌的链接也是很卡。

      磨延城 @撒哈拉的小猫 回复2014年12月13日 15时19分

      是的,因为相关js代码库(如jquery)、字体库浏览器无法加载,导致大部分特效功能无法正常运行,页面长时间处于假死状态
      这种情况更换360提供的前端公共库就可以解决了:http://libs.useso.com/

  2. 老董 回复2015年01月12日 10时31分
    磨者
    各种外部库都不是太靠谱,之前用七牛作为存储的,好像CNAME被屏蔽了,以后还是自己搞一个CDN库比较好。

      磨延城 @老董 回复2015年01月17日 07时49分

      是的,从我用七牛到现在,碰到的问题不止一两次了
      能自己搞,就自己搞一个CDN,如果经济情况不允许,只能用这些相对专业、实惠的CDN服务了

  3. 偏方 回复2015年01月19日 18时06分
    磨者
    DZ自从升了DZX之后,方向都变了,后面被收购了,更没有好产品。

      磨者 246 @偏方 回复2015年05月18日 15时58分
      磨者
      我刚刚就遇到这问题,挨个挨个的恢复设置,才发现这问题,于是我从百度搜到你家来了,原来是这么个原因,刚才看了下回复,说到CDN,我有个朋友,他把图片什么的都直接发到新浪微博上,然后在复制图片链接到自己网站上,我没试过,不过他的网站打开速度比使用七牛什么的要快很多

  4. 昆明绿芽户外 回复2015年02月02日 14时39分
    磨者
    确实是,我看了你的教程后关闭了云ip库检测,更新缓存之后打开帖子速度就快了起来!谢谢

  5. luoben 回复2015年04月02日 10时44分
    磨者
    太感谢了,折腾两天总算解决问题了。我把各种缓存模式都试过了,服务器php重启 数据库重启 nginx重启 加CDN 静态化页面 都试过了 。。。。最后居然是自己手贱点了这个云端IP的功能。。。

  6. owyang 回复2015年04月15日 14时12分
    磨者
    谢谢啊!唉 我草,,,,查了一整天···还是看到这个·······各种设置啊,各种优化,我草··居然是手贱开了这个的原因·······································································

      磨者 249 @owyang 回复2015年05月22日 11时37分
      磨者
      唉,和你一样,,我还升级了各版本mysql数据库。。。真是操蛋了,原来是点了这个云ip功能。。现在关了,真是飞快,相当飞快。。

  7. 覃师宁自媒体博客 回复2015年04月28日 10时14分
    磨者
    谢谢分享,玩dz论坛好久了,真没在意这些细节,毕竟不是咱技术流,分析的挺好!

  8. kvm 回复2015年05月12日 14时41分
    磨者
    多谢,解决了我的问题

  9. 磨者 247 回复2015年05月21日 10时37分
    磨者
    终于找到帖子慢的原因了
    非常感谢

  10. 磨者 251 回复2015年05月27日 08时56分
    磨者

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

    我来说两句:

      切换  

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

      切换  

    磨途歌随机验证码