前几天看到startbbs框架,简单的轻量级PHP框架,界面清新;所以搭建了一个;顺便看了下CodeIgniter的文档,大致了解了startbbs的源码结构和运行机制;基于自己的喜好对框架做了部分的修改。
安装完成了,感觉挺好的,然后发布第一个帖子,发现正常发布奇慢无比,然后经常性504。
跟踪了一下代码 。
很快定位topic.php 里面的add函数;
if($this->config->item('auto_tag') =='on'){
//自动获取关键词tag
$data['keywords'] = $this->tag_m->get_tag_auto(strip_tags($data['title']), strip_tags($data['content']));
} else{
$data['keywords'] = $this->input->post ('keywords', true);
}
这里大致是读取‘ auto_tag’配置,如果开启了自动获取关键词,将调用$this->tag_m->get_tag_auto
;跟踪到tag_m.php
里面;发现是调用http://keyword.discuz.com/
的外部服务进行关键词分析;
$data = $this->sb_get_contents('http://keyword.discuz.com/related_kw.html?ics=utf-8&ocs=utf-8&title='.rawurlencode($title).'&content='.rawurlencode(mb_substr($content,0,500)));
这个服务超时了,那么简单解决办法就是更换一个可用的关键词分析服务或者关闭自动获取关键词的配置;解决之后,就正常了。
然后在网络上大致查了下502和504的区别和各自发生的原因和场景。
一般情况下服务器发生500错误是比较好追查的,一般在日志里面都有错误栈打出,据此容易定位和修正代码错误。
但是一般502、504发生时,服务器基本都没有错误日志可供追查,因为并不是直接因为代码执行层面发生了错误;此时需要具体了解为什么会有502和504错误。
502: Bad Gateway;504: Gateway Timeout;
从字面意思看来,都是因为Gateway发生了问题;什么是Gateway,个人的理解就是对PHP这种脚本服务器而言,服务器的脚本执行程序(FastCGI服务)发生错误或者出现超时就会报502或者504。
典型的502错误是,如果PHP-CGI被卡住,所有进程都正在处理;那么当新的请求进来时,PHP-CGI将无法处理新的请求就会导致502出现;
而504的典型错误就像上文所述,PHP执行被阻塞住,导致nginx等服务迟迟收不到返回的数据,此时就会报504的错误。