首页 > 学习收获 > wordpress > WordPress数据库超时解决方法
2007
09-09

WordPress数据库超时解决方法

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

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

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

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

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

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

if ( defined(‘DB_COLLATE’) )
$this->collate = DB_COLLATE;

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

$this->dbuser = $dbuser;
$this->dbpassword = $dbpassword;
$this->dbname = $dbname;
$this->dbhost = $dbhost;

$this->connecttodb();
}

function connecttodb(){

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

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

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

修改为:

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

稍微往下一点,还有一行

$this->select($dbname);

也要相应的修改为:

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

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

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

function checkconnection(){
$maxcount = 5;
$cnt = 1;

$ping = mysql_ping( $this->dbh ) ;

while( !$ping && $cnt < $maxcount) { @mysql_close($this->dbh);
$this->connecttodb();

$ping = mysql_ping( $this->dbh ) ;

if(!$ping )
{
sleep(2);
}
$cnt+=1;
}

if(!$ping ) { die(“Attempted to connect for ” . $maxcount . ” but failed…”) ; }

}

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

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

$this->checkconnection();

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

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

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

最后编辑:
作者:龙天
这个作者貌似有点懒,什么都没有留下。

WordPress数据库超时解决方法》有 1 条评论

  1. […] WordPress数据库超时解决方法| 龙天小筑 […]

留下一个回复

你的email不会被公开。