【问题标题】:Error while sending STMT_PREPARE packet. PID=2发送 STMT_PREPARE 数据包时出错。 PID=2
【发布时间】:2014-05-20 21:28:15
【问题描述】:

我不知道为什么会遇到这个错误。

我有以下脚本:

foreach($brands as $brand){ // 这个循环大约 600 项 …… …… DB::table('mailing_list')->插入(数组( '电子邮件' => $电子邮件, '来源' => $来源, 'source_url'=> $brand->external_url, 'facebook_url' => $facebook_url, 'instagram_id' => $instagram_username, 'instagram_url' => $instagram_url, 'instagram_followers' => $instagram_followers )); }

总是在同一个项目上中断

发送 STMT_PREPARE 数据包时出错。 PID=2 (SQL: 插入到 `mailing_list` (`email`, `source`, `source_url`, `facebook_url`, `instagram_id`, `instagram_url`, `instagram_followers`) 值 (some@email.com, source, www.url.com, https://www.facebook.com/url, some_username, http://instagram.com/url, 501))

之前我执行了 29 个查询,现在是 34 个。

我想更好地理解这个错误:可能是单个条目破坏了它,但即使我发布的数据是胡言乱语,实际的数据在我看来也不错。

我的尝试:

设置时间限制(3600); DB::connection()->disableQueryLog(); DB::reconnect(Config::get('database.default')); // 这个在每个 foreach 循环之后

【问题讨论】:

  • 在你的mysql配置中使用max_allowed_packet怎么样?这是警告吧?
  • @majimboo,我忘了提到我在共享主机上......从这个问题stackoverflow.com/questions/5688403/… 看来我无法改变这个值,但我会给试试看
  • 插入查询看起来像缺少字符串值的单引号,您可能需要检查。
  • 这似乎是由 Laravel 查询构建器构建的。是的,它缺少那些表示字符串的 qoutes。可能想清理你的 laravel 版本。
  • 你会如何检查它?我可以告诉你,我正确插入了大约 40 行,我认为这不是问题......但无论如何我都会尝试对其进行清理

标签: php mysql laravel laravel-4 eloquent


【解决方案1】:

问题的真正原因和解决方法可以在我的博文中找到:

Laravel 4 and "Error while sending STMT_PREPARE packet"

在这里描述整个答案是不可能的,但长话短说,Laravel 4 的 \Illuminate\Database\MySqlConnection 类中有一个错误。具体来说,在它的causedByLostConnection 方法中,看起来像这样:

/**
 * Determine if the given exception was caused by a lost connection.
 *
 * @param  \Illuminate\Database\QueryException
 * @return bool
 */
protected function causedByLostConnection(QueryException $e)
{
    return str_contains($e->getPrevious()->getMessage(), 'server has gone away');
}

不幸的是,“服务器已消失”并不是唯一表明与 MySQL 的连接丢失的消息。

Laravel 5 中的相同方法检查 6 条附加消息,这解决了问题:

/**
* Determine if the given exception was caused by a lost connection.
*
* @param  \Exception  $e
* @return bool
*/
protected function causedByLostConnection(Exception $e)
{
    $message = $e->getMessage();

    return Str::contains($message, [
        'server has gone away',
        'no connection to the server',
        'Lost connection',
        'is dead or not enabled',
        'Error while sending',
        'decryption failed or bad record mac',
        'SSL connection has been closed unexpectedly',
    ]);
}

【讨论】:

  • 我已经有一段时间没有收到这个错误了......我没有时间测试你的答案,但如果你设法获得一些支持,我会接受这个答案
  • 没问题。只是想为其他人遇到这个问题做出贡献。
  • 不幸的是,即使在使用 Laravel 5.7 时,我也经常遇到此错误,因此肯定有其他根本原因和解决方案。
  • 我猜 Laravel 引入了一个新问题,因为我已经有几年没有收到这样的反馈了,然后突然有人开始报告我的解决方案不起作用。不幸的是,我不再使用 Laravel,所以我不确定可能是什么问题。
【解决方案2】:

我在按此顺序执行以下操作的脚本中遇到了这个问题:

  1. 连接到本地数据库
  2. 通过 cURL 连接到远程 API
  3. 更新本地数据库

似乎第 2 步有时需要很长时间才能完成,最终导致与数据库的连接超时/断开。

为了解决这个问题,我只是改变了操作的顺序,所以我连接到数据库长时间运行的操作之后,就在我对数据库进行工作之前:

  1. 通过 cURL 连接到远程 API
  2. 连接到本地数据库
  3. 更新本地数据库

【讨论】:

    【解决方案3】:

    我已经通过减少传递给 foreach 循环的项目来解决它。

    $all_brands = 品牌::all(); $填充 = 0; $批次 = 100; while($all_brands->count() > $padding){ $brands = Brand::orderBy('id', 'asc')->skip($padding)->take($batch)->get(); foreach($brands 作为 $brand){ …… …… DB::table('mailing_list')->插入(数组( '电子邮件' => $电子邮件, '来源' => $来源, 'source_url'=> $brand->external_url, 'facebook_url' => $facebook_url, 'instagram_id' => $instagram_username, 'instagram_url' => $instagram_url, 'instagram_followers' => $instagram_followers )); } $padding = $padding + $batch; }

    【讨论】:

    【解决方案4】:

    几天前我遇到了同样的问题,所以解决这个问题的最简单方法是对数据库(在我的例子中是 mysql).cnf 配置文件进行一些更改。需要更改的变量是 wait_timeout。默认为30 ,但如果增加它,则不会出现此错误。就我而言,我已将其设置为 10 分钟,现在我的脚本就像魅力一样工作。

    发生的事情是脚本将初始化,并等待直到我的所有 API 调用完成,然后再开始解析它们中的每一个,顺便说一下,在 for each 循环中也是如此。因此,直到它需要进行数据库查询时,它已经失去了连接。希望能帮助到你!

    【讨论】:

    【解决方案5】:

    问题肯定与关闭的连接有关。发生这种情况的原因有很多。

    在我们的例子中,它将大数据包发送到 DB(我们将 blob 存储在 DB 中)。 将变量 max_allowed_packet 的大小从默认设置 4MB 增加到更大的 32MB 解决了一个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 2017-08-10
      • 2019-06-03
      • 2015-08-25
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      相关资源
      最近更新 更多