小窝复活。嗯。继续技术。
不过之前也就一周一帖,很对不起观众啊,呵呵。反正这里也没什么固定观众。
嗯。言归正传。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,可以在这里找到适合自己的文件,直接下载替换即可。呵呵。原理不知道是不是一样,但是一样能解决问题~
- 本文固定链接: https://www.dragongod.net/2007/09/wordpress-sql-timeout-resolve/
- 转载请注明: 龙天 于 龙天小筑 发表
[…] WordPress数据库超时解决方法| 龙天小筑 […]