【问题标题】:How do I verify that WordPress database connections are closed using PHP?如何验证是否使用 PHP 关闭了 WordPress 数据库连接?
【发布时间】:2014-01-12 19:48:15
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以使用缓存插件提高页面加载速度。它们将页面的 HTML 输出存储在静态文件中,以大大减少 SQL 查询的数量。我发现W3 Total Cache 做得很好。
  • 我认为缓存是个好主意。但是,我认为它不会解决如此严重的问题,也不会为我提供我所寻求的令人欣慰的信息。我们过去曾尝试过缓存,但性能几乎没有提高。一旦当前的性能问题得到解决,我们打算再试一次。

标签: php wordpress database-connection


【解决方案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 迁移到更新的版本时,请在 cmets 中通知我,我会更新此答案和原始问题中的答案。

自动关闭,持久连接

你在使用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;
}

wp-includes/wp-db.php.

验证连接是否关闭

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

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

如果没有这样的清单,你就完蛋了。无法列出当前脚本建立的所有数据库连接。您只能list all connections to a server 与您有活动连接,但不能作为 PHP 资源。如果你想关闭它们,如果你有足够高的权限,你可以使用KILL statement 来做到这一点。但请记住,连接可能已经创建并且可能正在被其他脚本使用。

另见

【讨论】:

  • 你知道验证所有插件是否使用$wpdb的方法吗?还是我需要查看每个插件的代码?并感谢您在跟踪验证连接方面提供的良好线索。
  • @tom.fflux 更准确地说,您要验证插件不使用任何其他方式访问数据库。确实,确保他们不这样做的最终方法是代码审查。当使用许多插件并且不想绝对确定时,您可以尝试检测其他访问数据库的方法。您可以使用 APD extensionrename 例如mysql_connect()orig_mysql_connect() 并创建一个新的 mysql_connect() 记录调用它的位置,然后调用 orig_mysql_connect()
  • @tom.fflux 您也可以使用runkit 代替APD。但是要覆盖内置函数,需要在 PHP 配置中启用runkit.internal_override
  • @tom.fflux 还从wp-config.php 寻找使用DB_* 常量可能会提供一些信息。创建自己的数据库连接的插件需要凭据。
【解决方案2】:

WP 4.5 现在有一个 $wpdb->close 方法

【讨论】:

  • 你好,每次wpdb连接后是否需要使用$wpdb->close()?
【解决方案3】:

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

我在 VPS 上也遇到过此类问题,托管服务提供商告诉我必须关闭连接,解决方案是添加页面缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-27
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多