持久PHP连接的MySQL“走了”错误
我在WAMP堆栈上本地托管一个网站.我最近通过向PDO构造函数选项参数添加数组(PDO :: ATTR_PERSISTENT => true)来将
PHP连接切换为持久性.我注意到响应时间因此下降了(万岁!).
当机器醒来时,缺点似乎是一个消失的错误.在更改连接样式之前从未发生这种情况. 缓存连接是否可能已关闭,但仍会继续返回?是否可以通过catch块内的PHP重置PDO连接或重置连接池? 解决方法
我已经开了几天,基于网络上类似问题的普遍存在,这似乎是PDO的一个缺陷,阻碍了对持久连接的有效管理.
明显问题的答案: > PHP 5.4.22 我可以通过执行以下操作重新创建问题: 在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销毁资源.如果数据库逻辑做了这样的一些尝试(如果发生更严重的错误,则必须有限制),这可能有助于将这些错误保持在最低限度. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |