Heim > Backend-Entwicklung > PHP-Tutorial > mysql 连接到底是什么?

mysql 连接到底是什么?

WBOY
Freigeben: 2016-06-06 20:15:49
Original
1377 Leute haben es durchsucht

$db = new PDO()
在底层,生成的DB实例,到底是什么?

在linux下一切皆文件理念下,我想,这个实例应该也是一个文件。
1、那这个文件保存着哪些信息?

假设这样一个场景:

<code>$db = new PDO(...)
while(true){
sleep(90000)
    $db->xx()
}
</code>
Nach dem Login kopieren
Nach dem Login kopieren

DB连接长时间不活动,mysql会自动断开,在断开后,这时PHP去请求会报 MySQL server has gone away的错误。

2、如何在$db->xx()前判断这个DB已经断开了?

回复内容:

$db = new PDO()
在底层,生成的DB实例,到底是什么?

在linux下一切皆文件理念下,我想,这个实例应该也是一个文件。
1、那这个文件保存着哪些信息?

假设这样一个场景:

<code>$db = new PDO(...)
while(true){
sleep(90000)
    $db->xx()
}
</code>
Nach dem Login kopieren
Nach dem Login kopieren

DB连接长时间不活动,mysql会自动断开,在断开后,这时PHP去请求会报 MySQL server has gone away的错误。

2、如何在$db->xx()前判断这个DB已经断开了?

  1. 那这个文件保存着哪些信息?
    我也没找到那个文件,实例对象都在内存吧

  2. 如何在$db->xx()前判断这个DB已经断开了?
    可以使用异常抛出:

<code class="php"><?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();
}
?></code>
Nach dem Login kopieren

PHP提供持久化连接
持久连接缓存可以避免每次脚本需要与数据库回话时建立一个新连接的开销,从而让 web 应用程序更快。

<code class="php"><?php $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));
?></code>
Nach dem Login kopieren

RESOURCE

mysql 导致这个行为的地方有两个 interactive_timeout 、wait_timeout
可以通过修改mysql配置文件/etc/my.cnf来延长时间。这里设置的是10秒
[mysqld]

<code>wait_timeout=10
interactive_timeout=10
</code>
Nach dem Login kopieren

解决方法是:
将这两个参数改为:

<code>wait_timeout=100
interactive_timeout=100
</code>
Nach dem Login kopieren

重启MySQL Server进入后,查看设置已经生效。
你试一试

本质上,对mysql的链接就是一个普通到socket套接字,所以也是一个File Descriptor。既然是tcp链接,那么链接双方有权利在任何时刻断开链接,就像楼上大神所说,这一般由mysql服务器定义链接超时时间,这样做是为了防止过多的链接导致mysql资源占用。

一般来说在php中并不需要sleep啥的,正常对pdo对象的使用并不用考虑链接超时,pdo会维护好一切。

<code>if($db){ $db->xx() }</code>
Nach dem Login kopieren

一切归文档,参阅官方文档,一般便知

本质是一块内存缓冲区

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage