WordPress数据库超时解决方法

星期天,九月9日, 2007  |  12:50:43分类:wordpress  |  标签:  |  

小窝复活。嗯。继续技术。

不过之前也就一周一帖,很对不起观众啊,呵呵。反正这里也没什么固定观众。

嗯。言归正传。WordPress是一个很依赖数据库的系统,但是它和数据库的交互好像有点小问题,偶尔会出现数据库超时,而WP又不会自动重新连接,导致一些功能的不正常。在我这个小窝尤其明显,由于开了两个WP,而且还使用了FIRESTATS啊GEOTRACK等等与数据库频繁交互的插件,有时会导致数据库无响应,直接表现就是:留言后点击提交,页面自动跳至首页导致留言丢失,或者后台管理时点击某个页面后,跳转到管理首页。虽说遇到此类情况,再进行一次相同的操作即可,但是毕竟很麻烦,尤其是留言方面,大段留言的丢失势必影响读者的心情啊。。

所以要解决。网上搜了很多,但是只找到冰山一角大哥的一篇文章。然后结合在WP交流群里,另一位兄弟Jukin一篇文章,完成了这个问题的解决。

原理很简单,在每次QUERY数据库之前,先使用mysql_ping检测一下数据库的连接,如果ping的结果超时,那就重新连接数据库。然后再进行query。具体流程如下:

首先,打开wp-includes文件夹下的wp-db.php。这就是wp与数据库交互的核心文件了。找到如下两行代码:

  1. if ( defined('DB_COLLATE') )
  2.             $this->collate = DB_COLLATE;

我的wp2.2.2是在58、59两行,在这两行代码后添加下面几行代码:

  1. $this->dbuser = $dbuser;
  2.             $this->dbpassword = $dbpassword;
  3.             $this->dbname = $dbname;
  4.             $this->dbhost = $dbhost;
  5.  
  6.             $this->connecttodb();
  7.         }
  8.  
  9.     function connecttodb(){

呵呵,可以看到,这几行代码在完成一个赋值之后,将原函数拆为两个函数。也就是说:利用原有程序构建了一个connectodb函数。这是很关键的一步。呵呵

随后,就要修改这个connecttodb函数内部的代码了。把紧接着的那一行

  1. $this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);

修改为:

  1. $this->dbh = @mysql_connect($this->dbhost, $this->dbuser, $this->dbpassword);

稍微往下一点,还有一行

  1. $this->select($dbname);

也要相应的修改为:

  1. $this->select($this->dbname);

这也是关键的一步哦。忘记修改的话,会导致报错。。我开始就是这里忘了修改,后来费了很多时间才找到毛病。。。

函数构建完毕。接下来找个合适的地方插入如下这个检测超时的函数体吧:

  1. function checkconnection(){
  2.         $maxcount = 5;
  3.         $cnt = 1;
  4.  
  5.         $ping = mysql_ping( $this->dbh ) ;
  6.  
  7.         while( !$ping && $cnt < $maxcount)
  8.         {
  9.             @mysql_close($this->dbh);
  10.             $this->connecttodb();
  11.  
  12.             $ping = mysql_ping( $this->dbh ) ;
  13.  
  14.             if(!$ping )
  15.             {
  16.                 sleep(2);
  17.             }
  18.             $cnt+=1;
  19.         }
  20.  
  21.         if(!$ping ) { die("Attempted to connect for " . $maxcount . " but failed...") ; }
  22.  
  23.     }

可以看见,其中使用了connecttodb这个函数,所以要构建这个函数啊。呵呵。。

最后一步,找到query这个function,在函数的最开始,插入对检测函数的调用:

  1. $this->checkconnection();

好了。完工。上传替换原有的wp-db.php,问题应该就能解决了。呵呵。。

2.2.1修改完的文件大家可以去Jukin那里下,貌似都通用吧。不过,还是自己动手改来的好,学会了以后也能移植使用么。呵呵。

UPDATE 2008.04.11:国外有高手,已经做好了修改好的wp-db.php,可以在这里找到适合自己的文件,直接下载替换即可。呵呵。原理不知道是不是一样,但是一样能解决问题~

喜欢本文,那就收藏到: Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网

发表您的评论