PHP & PDO - 有什么方法可以建立 'safe' 持久连接吗?

标签 php pdo connection persistent

我知道(通过阅读 SO 和其他网站上的无数帖子)持久连接并不是绝大多数开发人员非常喜欢的东西(如果脚本突然终止,连接没有关闭,你可能会结束离开一些表被锁定等),但这真的很糟糕吗?

在我的开发机器(T3400 双核 CPU、4 GB 内存和 5400RPM 硬盘)上,页面加载时间非常不同,这取决于我使用的是持久性还是非持久性连接。非持久连接的 2.09 秒与持久连接的(大约)68 毫秒非常不同。这里有两个示例屏幕截图供您查看:non-persistentpersistent .

我理解持久连接的风险(我并不是真的每天都使用它们,虽然我觉得这个概念很有趣并且我想探索它),但是没有任何方法可以检测非-关闭连接?

例如,相当于 mysqli 的 change_user 但对于 PDO 或某种 PHP 脚本,服务器每 X 秒作为 cron 作业运行一次以检查遗留问题,随后,关闭它们?我正在阅读有关 register_shutdown_function 的内容,但是,如果我理解正确的话,它会在脚本完成后被调用,所以在实践中,这可能意味着它会在每次脚本完成时结束关闭我的持久连接。还是我错了?

编辑

为了准确起见,我忘了提及我的软件堆栈,所以让我修改一下。我当前的堆栈由以下元素组成:Windows 7 (x86) SP1 作为操作系统,Apache 2.4.3PHP 5.4.9 (我总是使用最新版本)和 MySQL 5.5.28。以 localhost 运行堆栈(我可能正在将它迁移到专用机器上,但目前,它保持这样)。

最佳答案

为避免连接在每次关闭时关闭,您可以在关闭函数中检查 error_get_last()

请注意,error_get_last() 也会返回“错误”,例如 E_NOTICE 等。这应该根据您的需要进行过滤。

<?php

register_shutdown_function('shutdown');

function shutdown() {

    static $ignore = array (
        E_STRICT,
        E_NOTICE,
        E_USER_NOTICE,
        E_DEPRECATED,
        E_USER_DEPRECATED, // ...
    );

    $error = error_get_last();
    // if no error has been queued or it should be ignored ...
    if(is_null($error) || in_array($error['type'], $ignore)) {
        return; // do nothing
    }

    // here comes your connection close code
    connection_close($your_connection);
}

但这是一个非常棘手的解决方案,有很多限制 see www.php.net .

我想知道,因为在使用非永久连接时服务页面需要大约 2 秒的时间。这真的意味着建立与数据库服务器的连接需要大约 2 秒吗?如果是这样,我会注意这一点,因为它看起来很长。你使用什么数据库服务器?数据库服务器是否位于不同的机器上?

关于PHP & PDO - 有什么方法可以建立 'safe' 持久连接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13877106/

相关文章:

php pdo 在函数返回中准备

java - 当前连接的蓝牙设备android

python - 简单的 Python 程序卡住了

java - 运行 Riak 的示例 TasteOfRiak.java 时连接意外关闭

php - 数据库对象不工作 (PHP) : "Call to a member function query() on a non-object"

php - 事件驱动的进度条 - Javascript

php - PDO BindParam 捷径?

php - 如何从 URL 参数查询 API

php - Laravel 5.4 获取 id 的 json 数组

php - PDO 数组,如果记录已经存在