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 相关文章推荐
支持oicq头像的留言簿(二)
Oct 09 PHP
PHP5 面向对象程序设计
Feb 13 PHP
joomla内置的表单验证功能使用方法
Jun 11 PHP
php实现天干地支计算器示例
Mar 14 PHP
thinkPHP5.0框架API优化后的友好性分析
Mar 17 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
Feb 13 PHP
php用xpath解析html的代码实例讲解
Feb 14 PHP
PHP设计模式之简单工厂和工厂模式实例分析
Mar 25 PHP
php命名空间设计思想、用法与缺点分析
Jul 17 PHP
php使用Swoole实现毫秒级定时任务的方法
Sep 04 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 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
js GridView 实现自动计算操作代码
2009/03/25 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
js将当前时间格式转换成时间搓(自写)
2013/09/26 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
JS简单实现数组去重的方法分析
2017/10/14 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
使用tensorflow实现AlexNet
2017/11/20 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
【HTML5】3D模型--百行代码实现旋转立体魔方实例
2016/12/16 HTML / CSS
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
高中生学习生活的自我评价
2013/10/09 职场文书
大家检讨书5000字
2014/02/03 职场文书
感恩节活动策划方案
2014/05/16 职场文书
教师批评与自我批评
2014/10/15 职场文书
商家认证委托书格式
2014/10/16 职场文书
小学生安全保证书
2015/05/09 职场文书
原告代理词范文
2015/05/25 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
创业计划之特色精品店
2019/08/12 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
导游词之无锡古运河
2019/11/14 职场文书