$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已经断开了?
高洛峰2017-04-10 17:00:20
那这个文件保存着哪些信息?
我也没找到那个文件,实例对象都在内存吧
如何在$db->xx()前判断这个DB已经断开了?
可以使用异常抛出:
<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
foreach($dbh->query('SELECT * from FOO') as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
PHP提供持久化连接
持久连接缓存可以避免每次脚本需要与数据库回话时建立一个新连接的开销,从而让 web 应用程序更快。
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>
阿神2017-04-10 17:00:20
mysql 导致这个行为的地方有两个 interactive_timeout 、wait_timeout
可以通过修改mysql配置文件/etc/my.cnf来延长时间。这里设置的是10秒
[mysqld]
wait_timeout=10
interactive_timeout=10
解决方法是:
将这两个参数改为:
wait_timeout=100
interactive_timeout=100
重启MySQL Server进入后,查看设置已经生效。
你试一试
阿神2017-04-10 17:00:20
本质上,对mysql的链接就是一个普通到socket
套接字,所以也是一个File Descriptor
。既然是tcp
链接,那么链接双方有权利在任何时刻断开链接,就像楼上大神所说,这一般由mysql
服务器定义链接超时时间,这样做是为了防止过多的链接导致mysql
资源占用。
一般来说在php
中并不需要sleep
啥的,正常对pdo
对象的使用并不用考虑链接超时,pdo
会维护好一切。