mysql 连接到底是什么?
$db = new PDO()
在底层,生成的DB实例,到底是什么?
在linux下一切皆文件理念下,我想,这个实例应该也是一个文件。
1、那这个文件保存着哪些信息?
假设这样一个场景:
$db = new PDO(...)
while(true){
sleep(90000)
$db->xx()
}
DB连接长时间不活动,mysql会自动断开,在断开后,这时PHP去请求会报 MySQL server has gone away的错误。
2、如何在$db->xx()前判断这个DB已经断开了?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
那这个文件保存着哪些信息?
我也没找到那个文件,实例对象都在内存吧
如何在$db->xx()前判断这个DB已经断开了?
可以使用异常抛出:
RESOURCE
mysql 导致这个行为的地方有两个 interactive_timeout 、wait_timeout
可以通过修改mysql配置文件/etc/my.cnf来延长时间。这里设置的是10秒
[mysqld]
解决方法是:
将这两个参数改为:
重启MySQL Server进入后,查看设置已经生效。
你试一试
本质上,对mysql的链接就是一个普通到
socket
套接字,所以也是一个File Descriptor
。既然是tcp
链接,那么链接双方有权利在任何时刻断开链接,就像楼上大神所说,这一般由mysql
服务器定义链接超时时间,这样做是为了防止过多的链接导致mysql
资源占用。一般来说在
php
中并不需要sleep
啥的,正常对pdo
对象的使用并不用考虑链接超时,pdo
会维护好一切。一切归文档,参阅官方文档,一般便知
本质是一块内存缓冲区