mysql 连接到底是什么?

发布于 2022-09-02 10:18:23 字数 325 浏览 8 评论 0

$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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

双马尾 2022-09-09 10:18:23
  1. 那这个文件保存着哪些信息?
    我也没找到那个文件,实例对象都在内存吧

  2. 如何在$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
));
?>
挖个坑埋了你 2022-09-09 10:18:23

RESOURCE

奈何桥上唱咆哮 2022-09-09 10:18:23

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进入后,查看设置已经生效。
你试一试

℡寂寞咖啡 2022-09-09 10:18:23

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

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

橘味果▽酱 2022-09-09 10:18:23

本质是一块内存缓冲区

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文