gearman中worker常驻后台,导致MySQL server has gone away的解决方法

2025-05-27 0 73

本文实例讲述了gearmanworker常驻后台,导致MySQL server has gone away的解决方法。分享给大家供大家参考,具体如下:

产生这个原因主要有如下几点:

  1. 1mysql服务宕机了
  2. 2、长时间没有操作,超过了wait_timeout的设置,mysql自动断开
  3. 3mysql请求链接被主动kill
  4. 4、发送的请求或返回结果过大,可设置max_allowed_packet的值
  5. 5、程序中你都是通过单例来操作数据库,如果两个操作时间超过wait_timeout

为了演示的方便,设置wait_timeout时间为10秒

  1. > set global wait_timeout=10;
  2. > show global variables like 'wait_timeout';

worker.php代码如下:

  1. <?php
  2. //创建一个worker
  3. $worker = new GearmanWorker();
  4. //添加一个job服务
  5. $worker->addServer('127.0.0.1', 4730);
  6. //注册一个回调函数,用于业务处理
  7. $worker->addFunction('longTime', function($job) {
  8. //workload()获取客户端发送来的序列化数据
  9. $data = json_decode($job->workload(), true);
  10. $db = new mysqli('192.168.1.100', 'root', '', 'test');
  11. if($db->connect_error) {
  12. die('connect error');
  13. }
  14. //等待15秒,我们设置mysql的wait_timeout为10秒
  15. sleep(15);
  16. //当执行到这里时,因为超时,所以mysql自动把连接断开了
  17. $ret = $db->query("INSERT INTO test VALUES(NULL, {$data['title']}, {$data['content']});");
  18. if($ret) {
  19. return "插入成功\\n";
  20. }
  21. });
  22. //死循环
  23. //等待job提交的任务
  24. while($worker->work());

client.php代码如下:

  1. <?php
  2. //创建一个客户端
  3. $client = new GearmanClient();
  4. //添加一个job服务
  5. $client->addServer('127.0.0.1', 4730);
  6. //doNormal同步
  7. $ret = $client->doNormal('longTime', json_encode(array(
  8. 'title' => '我是标题',
  9. 'content' => '我是内容',
  10. )));
  11. echo $ret;

执行的结果如下图所示,出现了MySQL server has gone away的情况。

gearman中worker常驻后台,导致MySQL server has gone away的解决方法

一般的解决方法:

1、调大wait_timeout的值(不建议)
2、每次在操作数据库的时候,ping()一下,如果断开就重新连。
3、在wait_timeout时间间隔之内,我们时不时的去query('select 1+1');一下,让mysql知道连接还活着。

修改worker.php代码如下:

  1. <?php
  2. //创建一个worker
  3. $worker = new GearmanWorker();
  4. //添加一个job服务
  5. $worker->addServer('127.0.0.1', 4730);
  6. //注册一个回调函数,用于业务处理
  7. $worker->addFunction('longTime', function($job) {
  8. //workload()获取客户端发送来的序列化数据
  9. $data = json_decode($job->workload(), true);
  10. $db = new mysqli('192.168.1.100', 'root', '', 'test');
  11. if($db->connect_error) {
  12. die('connect error');
  13. }
  14. //等待15秒,我们设置mysql的wait_timeout为10秒
  15. sleep(15);
  16. //ini_set('mysqli.reconnect', 1);
  17. //php手册上说,ping会尝试重新连接,但现实是并不会
  18. //$db->ping();
  19. if(!$db->ping()) {
  20. $db->close();
  21. //重新连接数据库
  22. $db = new mysqli('192.168.1.100', 'root', '', 'test');
  23. }
  24. $ret = $db->query("INSERT INTO test VALUES(NULL, '{$data['title']}', '{$data['content']}');");
  25. if($ret) {
  26. return "插入成功\\n";
  27. }
  28. });
  29. //死循环
  30. //等待job提交的任务
  31. while($worker->work());

运行结果如下:

gearman中worker常驻后台,导致MySQL server has gone away的解决方法

希望本文所述对大家PHP程序设计有所帮助。

原文链接:https://www.cnblogs.com/jkko123/p/6505987.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 gearman中worker常驻后台,导致MySQL server has gone away的解决方法 https://www.kuaiidc.com/70754.html

相关文章

发表评论
暂无评论