我想使用PHP的register_shutdown_function
添加一个测试,以验证是否已关闭所有数据库连接。另外,我想自动关闭这些连接。我在共享托管环境中,因此没有太多的系统访问权。
当前网站遇到了可怕的性能问题(访问中断或页面加载时间> 60秒),特别是在超过10个访问者的负载下。减速会影响管理员屏幕,即使所有插件都被禁用也会发生。但有时候性能低于8秒页面加载。我们的托管服务提供商回应说我们有开放的数据库连接,有时需要手动关闭。
我知道WordPress推迟关闭与PHP的数据库连接,它不应该创建这些问题,还有什么可能。
答案 0 :(得分:1)
免责声明 :我不是Wordpress用户。我对Wordpress的了解来自于我现在用Google搜索的文章,其中一些文章已经过时了。
Wordpress提供wpdb
class及其全局实例$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;关闭方法