加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

持久PHP连接的MySQL“走了”错误

发布时间:2020-12-13 16:54:37 所属栏目:PHP教程 来源:网络整理
导读:我在WAMP堆栈上本地托管一个网站.我最近通过向PDO构造函数选项参数添加数组(PDO :: ATTR_PERSISTENT = true)来将 PHP连接切换为持久性.我注意到响应时间因此下降了(万岁!). 当机器醒来时,缺点似乎是一个消失的错误.在更改连接样式之前从未发生这种情况. 缓
我在WAMP堆栈上本地托管一个网站.我最近通过向PDO构造函数选项参数添加数组(PDO :: ATTR_PERSISTENT => true)来将 PHP连接切换为持久性.我注意到响应时间因此下降了(万岁!).

当机器醒来时,缺点似乎是一个消失的错误.在更改连接样式之前从未发生这种情况.

缓存连接是否可能已关闭,但仍会继续返回?是否可以通过catch块内的PHP重置PDO连接或重置连接池?

解决方法

我已经开了几天,基于网络上类似问题的普遍存在,这似乎是PDO的一个缺陷,阻碍了对持久连接的有效管理.

明显问题的答案:

> PHP 5.4.22
> php.ini中的驱动程序设置已打开持久连接
>会话限制不受限制(设置为-1)
>池限制不受限制(设置为-1)

我可以通过执行以下操作重新创建问题:

在MySQL数据库上发出以下语句.

set @@GLOBAL.interactive_timeout := 10;
set @@GLOBAL.wait_timeout := 10;

针对服务器发出一些请求以生成一些缓存连接.通过以下方式与非持久连接相比,您可以看到线程数增加:

echo $conn->getAttribute(PDO::ATTR_SERVER_INFO);

等待至少10秒钟,然后开始发出更多请求.你应该开始收到“离开”的消息.

问题是SQL关闭连接并且后续调用PDO构造函数返回这些已关闭的连接而不重新连接它们.

这是PDO缺乏的地方.没有办法强制连接打开,甚至没有办法检测状态.

我目前正在解决这个问题(不可否认的是有点黑客攻击)是发布这些MySQL语句

set @@GLOBAL.interactive_timeout := 86400;

set @@GLOBAL.wait_timeout := 86400;

These variables are set to 28800sec (8 hours) by default.请注意,您需要重新启动Apache以清除缓存的连接,否则在池中的所有连接都已循环之前您不会注意到差异(我不知道如何/何时发生这种情况).我选择86400这是24小时,我每天都在这台机器上,所以这应该涵盖基本需求.

在这次更新之后,我让我的机器至少停留了12个小时,这是我开始收到“离开消息”之前的时间.看起来问题已经解决了.

我一直在想,虽然我无法强制打开连接,但可能会从池中删除错误的连接.我没有试过这个,但稍微更优雅的解决方案可能是检测“消失”消息然后将对象设置为NULL告诉PHP销毁资源.如果数据库逻辑做了这样的一些尝试(如果发生更严重的错误,则必须有限制),这可能有助于将这些错误保持在最低限度.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读