相关疑难解决方法(0)

E_WARNING:发送STMT_PREPARE数据包时出错.PID =*

截至2019-01-30 14:52 UTC,您仍然可以赢得500分Bounty,因为没有一个答案有帮助!

我的Laravel 5.7网站遇到了一些我认为彼此相关的问题(但在不同时间发生):

  1. PDO::prepare(): MySQL server has gone away
  2. E_WARNING: Error while sending STMT_PREPARE packet. PID=10
  3. PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry (我的数据库似乎经常尝试在同一秒内写两次相同的记录.我一直无法弄清楚为什么或如何重现它;它似乎与用户行为无关.)
  4. 不知何故,前两种类型的错误只出现在我的Rollbar日志中,而不是出现在服务器上或我的Slack通知中的文本日志中,因为所有错误应该是(和所有其他错误).

几个月来,我一直看到这些可怕的日志消息,而且我完全无法重现这些错误(并且无法诊断和解决它们).

我还没有发现任何实际症状或听到用户的任何抱怨,但错误消息似乎并非易事,所以我真的想了解并解决根本原因.


我已经尝试更改我的MySQL配置使用max_allowed_packet=300M(而不是默认的4M)但在我有超过几个访问者访问我的网站的日子里仍然经常得到这些例外.

由于这个建议,我还设置了(从5M和10M改为)以下内容:

innodb_buffer_pool_chunk_size=218M
innodb_buffer_pool_size = 218M
Run Code Online (Sandbox Code Playgroud)

作为进一步背景:

  • 我的站点有一个运行jobs(artisan queue:work --sleep=3 --tries=3 --daemon)的队列工作者.
  • 根据访问者的注册时间,可以在同一时间安排一系列排队的作业.但我发现同时发生的最多是20.
  • MySQL慢查询日志中没有条目.
  • 我有几个cron工作,但我怀疑他们是有问题的.一分钟运行,但非常简单.另一个是每隔5分钟运行一次,如果有任何待处理的电子邮件,则会发 另一个每30分钟运行一次报告.
  • 我已经运行了各种mysqlslap查询(虽然我完全是新手)并且即使在模拟数百个并发客户端时也没有发现任何缓慢的问题.
  • 我正在使用Laradock(Docker).
  • 我的服务器是DigitalOcean 1GB RAM,1个vCPU,25GB SSD.我也试过2GB内存没有区别.
  • 结果来自SHOW VARIABLES;SHOW GLOBAL STATUS; 在这里.

my.cnf是:

[mysql]

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
character-set-server=utf8
innodb_buffer_pool_chunk_size=218M
innodb_buffer_pool_size …
Run Code Online (Sandbox Code Playgroud)

mysql performance laravel laravel-5 laradock

12
推荐指数
2
解决办法
1383
查看次数

PHP Codeigniter 3 MySQL服务器已经消失

我正在为Codeigniter中的PHP脚本运行Cron Job来转换上传的视频.一切都执行没有任何问题,但一旦它将数据插入数据库,我收到此错误:

Error Number: 2006 MySQL server has gone away

该过程基本上转换视频,如果成功,则从视频创建缩略图和海报,然后将视频数据插入数据库.我试过添加$this->db->reconnect();我的模型功能.这是功能:

function add_video($data)
{
  //BECASUE THE CONVERSION TAKES SO LONG WE NEED TO RECONNECT TO THE DATABASE AFTER EACH EXEC
  $this->db->reconnect(); 

  $this->db->insert('video_uploads', $data);
}
Run Code Online (Sandbox Code Playgroud)

这不起作用我仍然收到错误.如果我$this->db->reconnect();在每次exec收到这些错误后添加:

Message: mysql_ping() expects parameter 1 to be resource, boolean given

Message: mysql_real_escape_string() expects parameter 2 to be resource, boolean given

就像我们使用FFMPEG转换我的视频一样.

所有执行完成后如何保持连接活动,以便将数据插入数据库?

编辑:这是Codeigniter的$this->db->reconnect();功能:

public function reconnect()
{
    if (mysql_ping($this->conn_id) === FALSE)
    {
        $this->conn_id = FALSE;
    }
}
Run Code Online (Sandbox Code Playgroud)

php mysql codeigniter

5
推荐指数
1
解决办法
7041
查看次数

标签 统计

mysql ×2

codeigniter ×1

laradock ×1

laravel ×1

laravel-5 ×1

performance ×1

php ×1