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


Posted in PHP onFebruary 27, 2020

本文实例讲述了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代码如下:

<?php
//创建一个worker
$worker = new GearmanWorker();
//添加一个job服务
$worker->addServer('127.0.0.1', 4730);
//注册一个回调函数,用于业务处理
$worker->addFunction('longTime', function($job) {
  //workload()获取客户端发送来的序列化数据
  $data = json_decode($job->workload(), true);

  $db = new mysqli('192.168.1.100', 'root', '', 'test');
  if($db->connect_error) {
    die('connect error');
  }

  //等待15秒,我们设置mysql的wait_timeout为10秒
  sleep(15);

  //当执行到这里时,因为超时,所以mysql自动把连接断开了
  $ret = $db->query("INSERT INTO test VALUES(NULL, {$data['title']}, {$data['content']});");
  if($ret) {
    return "插入成功\n";
  }
});

//死循环
//等待job提交的任务
while($worker->work());

client.php代码如下:

<?php
//创建一个客户端
$client = new GearmanClient();
//添加一个job服务
$client->addServer('127.0.0.1', 4730);

//doNormal同步
$ret = $client->doNormal('longTime', json_encode(array(
  'title' => '我是标题',
  'content' => '我是内容',
)));

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代码如下:

<?php
//创建一个worker
$worker = new GearmanWorker();
//添加一个job服务
$worker->addServer('127.0.0.1', 4730);
//注册一个回调函数,用于业务处理
$worker->addFunction('longTime', function($job) {
  //workload()获取客户端发送来的序列化数据
  $data = json_decode($job->workload(), true);
  
  $db = new mysqli('192.168.1.100', 'root', '', 'test');
  if($db->connect_error) {
    die('connect error');
  }
  
  //等待15秒,我们设置mysql的wait_timeout为10秒
  sleep(15);

  //ini_set('mysqli.reconnect', 1);
  //php手册上说,ping会尝试重新连接,但现实是并不会
  //$db->ping();

  if(!$db->ping()) {
    $db->close();
    //重新连接数据库
    $db = new mysqli('192.168.1.100', 'root', '', 'test');
  }

  $ret = $db->query("INSERT INTO test VALUES(NULL, '{$data['title']}', '{$data['content']}');");
  if($ret) {
    return "插入成功\n";
  }
});

//死循环
//等待job提交的任务
while($worker->work());

运行结果如下:

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

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

PHP 相关文章推荐
在PHP中操作Excel实例代码
Apr 29 PHP
php中常用的预定义变量小结
May 09 PHP
PHP基础教程(php入门基础教程)一些code代码
Jan 06 PHP
10个实用的PHP正则表达式汇总
Oct 23 PHP
php实现字符串反转输出的方法
Mar 14 PHP
php两种无限分类方法实例
Apr 21 PHP
PHP 读取文本文件内容并分页显示
Jan 02 PHP
CodeIgniter自定义控制器MY_Controller用法分析
Jan 20 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
Feb 05 PHP
PHP反射机制原理与用法详解
Feb 15 PHP
PDO::lastInsertId讲解
Jan 29 PHP
tp5框架的增删改查操作示例
Oct 31 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 #PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 #PHP
php使用gearman进行任务分发操作实例详解
Feb 26 #PHP
php实现根据身份证获取精准年龄
Feb 26 #PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 #PHP
PHP实现创建一个RPC服务操作示例
Feb 23 #PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 #PHP
You might like
新手学PHP之数据库操作详解及乱码解决!
2007/01/02 PHP
PHP防注入安全代码
2008/04/09 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
PHP strcmp()和strcasecmp()的区别实例
2016/11/05 PHP
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
微信小程序 参数传递实例代码
2017/03/20 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
微信小程序实现运动步数排行功能(可删除)
2018/07/05 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
Vue学习之组件用法实例详解
2020/01/06 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
Python 实现 贪吃蛇大作战 代码分享
2016/09/07 Python
Python实现将数据库一键导出为Excel表格的实例
2016/12/30 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
TensorFlow变量管理详解
2018/03/10 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
英国顶级家庭折扣店:The Works
2017/09/06 全球购物
家居饰品店创业计划书
2014/01/31 职场文书
校园环保建议书
2014/05/14 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
开展批评与自我批评发言稿
2014/10/16 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
博士论文答辩开场白
2015/06/01 职场文书
李强为自己工作观后感
2015/06/11 职场文书
红十字会救护培训简讯
2015/07/20 职场文书
2015年安全生产月工作总结
2015/07/27 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python