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 $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
Jun 21 PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
Nov 02 PHP
数据库中排序的对比及使用条件详解
Feb 23 PHP
Ajax+PHP快速上手及简单应用说明
Jul 24 PHP
eaglephp使用微信api接口开发微信框架
Jan 09 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
Jun 23 PHP
PHP加密解密类实例分析
Apr 20 PHP
php实现模拟post请求用法实例
Jul 11 PHP
PHP中Http协议post请求参数
Nov 02 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
Jun 30 PHP
php链式操作的实现方式分析
Aug 12 PHP
PHP笛卡尔积实现原理及代码实例
Dec 09 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
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
php下MYSQL limit的优化
2008/01/10 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
2011/08/09 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
PHP如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
获取焦点时,利用js定时器设定时间执行动作
2010/04/02 Javascript
javascript 快速排序函数代码
2012/05/30 Javascript
js调用css属性写法
2013/09/21 Javascript
JS求平均值的小例子
2013/11/29 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
浅谈JQ中mouseover和mouseenter的区别
2016/09/13 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
2017/01/22 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
AnglarJs中的上拉加载实现代码
2018/02/08 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
2019/01/15 jQuery
JS Ajax请求会话过期处理问题解决方法分析
2019/11/16 Javascript
python中去空格函数的用法
2014/08/21 Python
Python实现快速多线程ping的方法
2015/07/15 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
启动Atom并运行python文件的步骤
2018/11/09 Python
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
销售人员自我评价
2014/02/01 职场文书
2014年保洁工作总结
2014/11/24 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
入党积极分子党小组意见
2015/06/02 职场文书
演讲比赛主持词
2015/06/29 职场文书
男方家长婚礼致辞
2015/07/27 职场文书
食品安全主题班会
2015/08/13 职场文书
Python内置的数据类型及使用方法
2022/04/13 Python
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle