我不知道为什么我遇到这个错误。
我有以下脚本:
foreach($brands as $brand){ // about 600items for this loop .... .... DB::table('mailing_list')->insert(array( 'email' => $email, 'source' => $source, 'source_url'=> $brand->external_url, 'facebook_url' => $facebook_url, 'instagram_id' => $instagram_username, 'instagram_url' => $instagram_url, 'instagram_followers' => $instagram_followers )); }
总是在同一个项目中打破
Error while sending STMT_PREPARE packet. PID=2 (SQL: insert into `mailing_list` (`email`, `source`, `source_url`, `facebook_url`, `instagram_id`, `instagram_url`, `instagram_followers`) values (some@email.com, source, www.url.com, https://www.facebook.com/url, some_username, http://instagram.com/url, 501))
在我执行29个查询之前,现在是34。
我想更好地理解这个错误:它可能是破坏它的单一条目,但即使我发布的数据是胡言乱语,实际的那些对我来说也很好。
我做了什么:
set_time_limit(3600); DB::connection()->disableQueryLog(); DB::reconnect(Config::get('database.default')); // this one after each foreach loop
答案 0 :(得分:4)
问题的真正原因和解决方案可以在我的博客文章中找到:
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');
}
不幸的是,"服务器已经消失了#34;并不是唯一表明与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',
]);
}
答案 1 :(得分:1)
我通过减少传递给foreach循环的项目来解决它。
$all_brands = Brand::all(); $padding = 0; $batch = 100; while($all_brands->count() > $padding){ $brands = Brand::orderBy('id', 'asc')->skip($padding)->take($batch)->get(); foreach($brands as $brand){ .... .... DB::table('mailing_list')->insert(array( 'email' => $email, 'source' => $source, 'source_url'=> $brand->external_url, 'facebook_url' => $facebook_url, 'instagram_id' => $instagram_username, 'instagram_url' => $instagram_url, 'instagram_followers' => $instagram_followers )); } $padding = $padding + $batch; }
答案 2 :(得分:0)
前几天我遇到了同样的问题,所以解决这个问题的最简单方法就是对数据库进行一些更改(在我的情况下是mysql).cnf配置文件。需要更改的变量是 wait_timeout 。默认情况下, 30 秒,但如果您增加它,那么您将不会收到此错误。在我的情况下,我已将其设置为10分钟,现在我的脚本就像魅力一样。
正在发生的事情是脚本将初始化,并等待所有API调用完成后再开始解析它们中的每个循环,顺便说一句。因此,在它需要进行数据库查询之前,它已经失去了连接。希望能帮助到你!
答案 3 :(得分:0)
我在按以下顺序执行以下操作的脚本中遇到了这个问题:
似乎步骤2有时花费的时间太长,最终导致与数据库的连接超时/断开。
要解决此问题,我只是更改了操作顺序,所以在进行长时间操作之后,紧接在数据库上工作之前,我连接到数据库 :