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 相关文章推荐
Discuz板块横排显示图片的实现方法
May 28 PHP
php MsSql server时遇到的中文编码问题
Jun 11 PHP
php下清空字符串中的HTML标签的代码
Sep 06 PHP
CURL状态码列表(详细)
Jun 27 PHP
php中的curl使用入门教程和常见用法实例
Apr 10 PHP
smarty中英文多编码字符截取乱码问题解决方法
Oct 28 PHP
PHP中set error handler函数用法小结
Nov 11 PHP
Yii2.0高级框架数据库增删改查的一些操作
Nov 16 PHP
深入浅析php json 格式控制
Dec 24 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
PHP正则删除HTML代码中宽高样式的方法
Jun 12 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
May 08 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 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
php GeoIP的使用教程
2011/03/09 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
PHP编程入门的基本语法知识点总结
2016/01/26 PHP
Javascript中的常见排序算法
2007/03/27 Javascript
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
基于MVC方式实现三级联动(JavaScript)
2017/01/23 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
2018/04/22 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
ES10 特性的完整指南小结
2019/03/04 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
python把1变成01的步骤总结
2019/02/27 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
Python 多线程其他属性以及继承Thread类详解
2019/08/28 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
2020/04/03 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
欧洲最大的预定车位市场:JustPark
2020/01/06 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
中专三年学习的个人自我评价
2013/12/12 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
兼职安全员岗位职责
2015/02/15 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
党校团干班培训心得体会
2016/01/06 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
2019年最新版见习人员管理制度!
2019/07/08 职场文书
多表查询、事务、DCL
2021/04/05 MySQL
Java数组与堆栈相关知识总结
2021/06/29 Java/Android
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电