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 相关文章推荐
一个程序下载的管理程序(一)
Oct 09 PHP
php AJAX实例根据邮编自动完成地址信息
Nov 23 PHP
一周让你学会PHP 不错的学习资料
Feb 06 PHP
检测png图片是否完整的php代码
Sep 06 PHP
PHP统计目录下的文件总数及代码行数(去除注释及空行)
Jan 17 PHP
基于php常用正则表达式的整理汇总
Jun 08 PHP
PHP 文件编程综合案例-文件上传的实现
Jul 03 PHP
php验证身份证号码正确性的函数
Jul 20 PHP
PHP如何读取由JavaScript设置的Cookie
Mar 22 PHP
Laravel实现表单提交
May 07 PHP
php实现的mongoDB单例模式操作类
Jan 20 PHP
php和C#的yield迭代器实现方法对比分析
Jul 17 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介绍篇
2010/10/26 PHP
PHP strcmp()和strcasecmp()的区别实例
2016/11/05 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
php依赖注入知识点详解
2019/09/23 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
读jQuery之八 包装事件对象
2011/06/21 Javascript
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
详解angularjs4部署文件过大解决过程
2018/12/05 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
浅谈python对象数据的读写权限
2016/09/12 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
Django中URL的参数传递的实现
2019/08/04 Python
图文详解Django使用Pycharm连接MySQL数据库
2019/08/09 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
Java中的类包括什么内容?设计时要注意哪些方面
2012/05/23 面试题
搬家公司的创业计划书
2014/01/01 职场文书
酒店工程部经理岗位职责
2015/04/09 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python