如何验证使用PHP关闭WordPress数据库连接?

时间:2013-12-24 15:14:05

标签: php wordpress database-connection

我想使用PHP的register_shutdown_function添加一个测试,以验证是否已关闭所有数据库连接。另外,我想自动关闭这些连接。我在共享托管环境中,因此没有太多的系统访问权。

当前网站遇到了可怕的性能问题(访问中断或页面加载时间> 60秒),特别是在超过10个访问者的负载下。减速会影响管理员屏幕,即使所有插件都被禁用也会发生。但有时候性能低于8秒页面加载。我们的托管服务提供商回应说我们有开放的数据库连接,有时需要手动关闭。

我知道WordPress推迟关闭与PHP的数据库连接,它不应该创建这些问题,还有什么可能。

3 个答案:

答案 0 :(得分:1)

免责声明 :我不是Wordpress用户。我对Wordpress的了解来自于我现在用Google搜索的文章,其中一些文章已经过时了。

WPDB

Wordpress提供wpdb class及其全局实例$wpdb。如果我做对了,这个实例既可以在内部使用,也可以通过插件来执行所有数据库操作。

显式关闭wpdb连接

wpdb没有close方法。来自How to close wpdb connection?的WordPress答案:

  

没有明确的方法。它将链接标识符存储在$wpdb->dbh字段中,因此我猜您可以在其上使用mysql_close()

现在看起来像Wordpress is still using the outdated mysql API。现在有三个MySQL APIs in PHP。如果/当Wordpress迁移到更新的版本时,请在评论中通知我,我会在原始问题中更新此答案和答案。

自动关闭,持久连接

您使用的是persistent connections吗?它们无法关闭,它们在脚本完成执行后仍然存在。

使用非持久性连接时,应在脚本端关闭它们。引用mysql_connect功能手册页:

  

注意

     

一旦脚本执行结束,服务器的链接就会关闭,除非通过显式调用mysql_close()来关闭它。

Wordpress依赖于此,连接未明确关闭。如果您想要explicitly close the connection when destroying $wpdb,请更改

function __destruct() {
    return true;
}

function __destruct() {
    mysql_close($this->dbh);
    return true;
}
<{3>}中的

验证连接是否已关闭

如果您有要检查/关闭的连接列表,可以通过调用mysql_close并通过错误抑制和返回值检查来验证它们是否已经关闭:

if (@mysql_close($conn)) {
    echo "Closed now\n";
} else {
    echo "Probably already closed\n";
}

如果没有这样的清单,你就注定了。无法列出当前脚本所做的所有数据库连接。您只能wp-includes/wp-db.php表示您有活动连接,但不能作为PHP资源。如果要关闭它们,如果您具有足够高的权限,则可以使用list all connections to a server执行此操作。但请记住,连接可能已创建,并且可能正由其他脚本使用。

另见

答案 1 :(得分:0)

PHP使用托管资源,这意味着当脚本退出时会自动释放资源(包括数据库连接)。除非您使用持久连接,但WordPress不使用持久连接。

我在VPS上遇到过这种问题,主机提供商告诉我必须关闭连接,解决方法是添加页面缓存。

答案 2 :(得分:0)

WP 4.5现在有一个$ wpdb-&gt;关闭方法