【问题标题】:Connection Reset on MySQL queryMySQL 查询的连接重置
【发布时间】:2011-02-22 06:49:20
【问题描述】:

好吧,我很困惑。 我正在尝试对数据库(本地)执行查询,但我不断收到连接重置错误。我一直在通用 DAO 类中使用下面的方法来构建查询字符串并传递给 Zend_Db API。

public function insert($params) {
    $loop = false;
    $keys = $values = '';
    foreach($params as $k => $v){
        if($loop == true){
            $keys   .= ',';
            $values .= ',';
        }
        $keys   .= $this->db->quoteIdentifier($k);
        $values .= $this->db->quote($v);
        $loop = true;
    }

    $sql = "INSERT INTO " . $this->table_name . " ($keys) VALUES ($values)";

    //formatResult returns an array of info regarding the status and any result sets of the query
    //I've commented that method call out anyway, so I don't think it's that
    try {
        $this->db->query($sql);
        return $this->formatResult(array(
                true,
                'New record inserted into: '.$this->table_name
        ));
    }catch(PDOException $e) {
        return $this->formatResult($e);
    }
}

到目前为止,这一切正常 - 自从我们生成新表来记录用户输入后,错误就一直在发生。插入字符串如下所示:

INSERT INTO tablename(`id`,`title`,`summary`,`description`,`keywords`,`type_id`,`categories`) VALUES ('5539','Sample Title','Sample content','
\'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In et pellentesque mauris. Curabitur hendrerit, leo id ultrices pellentesque, est purus mattis ligula, vitae imperdiet neque ligula bibendum sapien. Curabitur aliquet nisi et odio pharetra tincidunt. Phasellus sed iaculis nisl. Fusce commodo mauris et purus vehicula dictum. Nulla feugiat molestie accumsan. Donec fermentum libero in risus tempus elementum aliquam et magna. Fusce vitae sem metus. Aenean commodo pharetra risus, nec pellentesque augue ullamcorper nec. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nullam vel elit libero. Vestibulum in turpis nunc.\'','this,is,a,sample,array',1,'category title') 

这是它在组装查询之前获得的参数 (var_dump):

array
    'id' => string '1' (length=4)
    'title' => string 'Sample Title' (length=12)
    'summary' => string 'Sample content' (length=14)
    'description' => string '<p>'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In et pellentesque mauris. Curabitur hendrerit, leo id ultrices pellentesque, est purus mattis ligula, vitae imperdiet neque ligula bibendum sapien. Curabitur aliquet nisi et odio pharetra tincidunt. Phasellus sed iaculis nisl. Fusce commodo mauris et purus vehicula dictum. Nulla feugiat molestie accumsan. Donec fermentum libero in risus tempus elementum aliquam et magna. Fusce vitae sem metus. Aenean commodo pharetra risus, nec pellentesque augue'... (length=677)
    'keywords' => string 'this,is,a,sample,array' (length=22)
    'type_id' => int 1
    'categories' => string 'category title' (length=43)

下一个停靠点是检查表上的限制,因为如果“描述”的长度在 300 左右(它在 310 - 330 之间变化),它似乎会插入。字段限制设置为 VARCHAR(1500),并且该字段的验证不允许超过 1200 的 HTML 超过 800 的内容。

真正的问题是,如果我使用这个 sql 字符串并通过命令行执行它,它可以正常工作 - 所以我一辈子都无法弄清楚出了什么问题。

我尝试过扩展服务器参数,即 Unexpected Connection Reset: A PHP or an Apache issue?

所以,简而言之,我被难住了。有什么想法吗?

【问题讨论】:

    标签: php mysql connection-reset


    【解决方案1】:

    好的,对于遇到此问题的任何其他人 - 问题与 Zend_Db_Statement 有关 - 或者更确切地说是该组件所依赖的 preg 库。它已在 Zend 问题跟踪器中标记:http://framework.zend.com/issues/browse/ZF-8399,但严格来说,它并不是 Zend 库的问题。根据您的服务器环境,您可能会也可能不会遇到此问题。就我而言,此错误发生在:

    赢XP, 沼泽 2 PHP 5.3

    可以使用解决

    db->getConnection()->exec($sql)
    

    直接通过适配器(PDO 等)有效地执行 sql。或者,您可以修改您的服务器以纠正 PCRE 本身中的段错误(尽管我承认我不完全确定您将如何处理)。希望对遇到同样问题的人有所帮助

    【讨论】:

    • 非常感谢,帮助了我! :) 顺便说一句,那应该是$db-&gt;getConnection()-&gt;exec($sql)
    【解决方案2】:

    对于那些在谷歌上搜索并找到这篇关于在执行 MySQL 查询时重置连接的帖子的人:

    除了sunwukung的回答,还请检查一下你的MySQL设置是否存在瓶颈,尤其是这个:

    max_allowed_packet = 1M
    

    您可以将其更改为更大的数字。这是我的:

    max_allowed_packet = 32M
    

    现在可以了。

    说明:

    从设置名称可以看出,连接重置主要是由于进出MySQL的数据集太大,“终止”了与MySQL的连接。

    【讨论】:

      【解决方案3】:

      您能否发布确切的错误消息(如果您使用 PDO,则为 $this->db->e​​rrorInfo())? 你确定你已经建立了数据库连接吗?

      【讨论】:

      • 连接正在重置,所以我没有任何脚本输出
      • 如果将 PDO::ERRMODE_SILENT 设置为 false 会怎样?
      • 不,还是死了。如果我创建一个新的 PDO 实例,那很好,只要它遇到 Zend_API 就会中断。
      • 我刚刚在 Zend Framework 问题跟踪器上找到了一个相同的错误 - 使用裸 PDO/MySQL 调用,这很好 - 所以它在 Zend 中。
      猜你喜欢
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 2016-05-19
      • 2011-11-25
      • 1970-01-01
      相关资源
      最近更新 更多