gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:13:33 24 4
gpt4 key购买 nike

我知道(通过阅读 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com