search

Home  >  Q&A  >  body text

php - 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已经断开了?

PHP中文网PHP中文网2902 days ago362

reply all(6)I'll reply

  • 高洛峰

    高洛峰2017-04-10 17:00:20

    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
    ));
    ?>

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 17:00:20

    RESOURCE

    reply
    0
  • 阿神

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

    reply
    0
  • 阿神

    阿神2017-04-10 17:00:20

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

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

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 17:00:20

    if($db){ $db->xx() }

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

    reply
    0
  • 黄舟

    黄舟2017-04-10 17:00:20

    本质是一块内存缓冲区

    reply
    0
  • Cancelreply