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

时间:2021-07-31 03:15:33

本文实例讲述了gearman中worker常驻后台,导致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.  
  11. $db = new mysqli('192.168.1.100', 'root', '', 'test');
  12. if($db->connect_error) {
  13. die('connect error');
  14. }
  15.  
  16. //等待15秒,我们设置mysql的wait_timeout为10秒
  17. sleep(15);
  18.  
  19. //当执行到这里时,因为超时,所以mysql自动把连接断开了
  20. $ret = $db->query("INSERT INTO test VALUES(NULL, {$data['title']}, {$data['content']});");
  21. if($ret) {
  22. return "插入成功\n";
  23. }
  24. });
  25.  
  26. //死循环
  27. //等待job提交的任务
  28. while($worker->work());

client.php代码如下:

  1. <?php
  2. //创建一个客户端
  3. $client = new GearmanClient();
  4. //添加一个job服务
  5. $client->addServer('127.0.0.1', 4730);
  6.  
  7. //doNormal同步
  8. $ret = $client->doNormal('longTime', json_encode(array(
  9. 'title' => '我是标题',
  10. 'content' => '我是内容',
  11. )));
  12.  
  13. 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.  
  11. $db = new mysqli('192.168.1.100', 'root', '', 'test');
  12. if($db->connect_error) {
  13. die('connect error');
  14. }
  15.  
  16. //等待15秒,我们设置mysql的wait_timeout为10秒
  17. sleep(15);
  18.  
  19. //ini_set('mysqli.reconnect', 1);
  20. //php手册上说,ping会尝试重新连接,但现实是并不会
  21. //$db->ping();
  22.  
  23. if(!$db->ping()) {
  24. $db->close();
  25. //重新连接数据库
  26. $db = new mysqli('192.168.1.100', 'root', '', 'test');
  27. }
  28.  
  29. $ret = $db->query("INSERT INTO test VALUES(NULL, '{$data['title']}', '{$data['content']}');");
  30. if($ret) {
  31. return "插入成功\n";
  32. }
  33. });
  34.  
  35. //死循环
  36. //等待job提交的任务
  37. while($worker->work());

运行结果如下:

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

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

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