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 相关文章推荐
smarty巧妙处理iframe中内容页的代码
Mar 07 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
May 16 PHP
php 判断数组是几维数组
Mar 20 PHP
基于empty函数的判断详解
Jun 17 PHP
php生成N个不重复的随机数实例
Nov 12 PHP
简单的php缓存类分享     php缓存机制
Jan 22 PHP
PHP创建桌面快捷方式的实例代码
Feb 17 PHP
php短址转换实现方法
Feb 25 PHP
php bootstrap实现简单登录
Mar 08 PHP
PHP正则表达式过滤html标签属性(DEMO)
May 04 PHP
php使用curl下载指定大小的文件实例代码
Sep 30 PHP
Smarty模板类内部原理实例分析
Jul 03 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懒人函数 自动添加数据
2011/06/28 PHP
Thinkphp中Create方法深入探究
2014/06/16 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
PHP微信PC二维码登陆的实现思路
2017/07/13 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
PHP实现简单用户登录界面
2019/10/23 PHP
JavaScript基本对象
2007/01/11 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
2015/03/01 Javascript
JavaScript遍历求解数独问题的主要思路小结
2016/06/12 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
2016/12/14 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
2018/03/15 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
npm全局环境变量配置详解
2020/12/15 Javascript
python二进制文件的转译详解
2019/07/03 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
全面解析HTML5中的标准属性与自定义属性
2016/02/18 HTML / CSS
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
应届毕业生个人求职信范文
2014/01/29 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
给下属加薪申请报告
2015/05/15 职场文书
迎新晚会主持词开场白
2015/05/28 职场文书
2016公务员年度考核评语
2015/12/01 职场文书
5行Python代码实现一键批量扣图
2021/06/29 Python
zabbix自定义监控nginx状态实现过程
2021/11/01 Servers