当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-14 13:04:15 浏览: 评论:0 

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

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

1、mysql服务宕机了

2、长时间没有操作,超过了wait_timeout的设置,mysql自动断开

3、mysql请求链接被主动kill

4、发送的请求或返回结果过大,可设置max_allowed_packet的值

5、程序中你都是通过单例来操作数据库,如果两个操作时间超过wait_timeout。

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

> set global wait_timeout=10;

> 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的解决方法

Tags: gearman worker away

分享到: