xzcxzfvxvc 发布于 2017-05-09 01:51

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

6 个回答
    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
    ));
    ?>
    2017-05-10 01:38 回答
  • RESOURCE

    2017-05-09 16:03 回答
  • 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-05-09 10:01 回答
  • 本质上,对mysql的链接就是一个普通到socket套接字,所以也是一个File Descriptor。既然是tcp链接,那么链接双方有权利在任何时刻断开链接,就像楼上大神所说,这一般由mysql服务器定义链接超时时间,这样做是为了防止过多的链接导致mysql资源占用。

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

    2017-05-09 15:25 回答
  • 2017-05-09 20:20 回答
  • 本质是一块内存缓冲区

    2017-05-09 05:28 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
活跃用户
  • 1
    问道摩托
  • 2
    袁广龙976丶
  • 3
    逍遥子
  • 4
    亮仔
  • 5
    芙蓉花
  • 6
    作小die_syj
  • 7
    mobiledu2502875483
  • 8
    王丽珠景平怡伦_621
  • 9
    adfa3sd5f6a
  • 10
    欣欣大妮
PHP1.CN | 中国最专业的PHP中文社区 | PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | PHP问答
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved PHP1.CN 第一PHP社区 版权所有