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+MYSQL开发工具及资源收藏
Jan 02 PHP
PHP中图片等比缩放的实例
Mar 24 PHP
PHP中Fatal error session_start()错误解决步骤
Aug 05 PHP
php自动获取关键字的方法
Jan 06 PHP
PHP中使用CURL获取页面title例子
Jan 07 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
May 13 PHP
thinkphp3.x中变量的获取和过滤方法详解
May 20 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
Dec 12 PHP
PHP中ajax无刷新上传图片与图片下载功能
Feb 21 PHP
使用Laravel中的查询构造器实现增删改查功能
Sep 03 PHP
浅谈laravel数据库查询返回的数据形式
Oct 21 PHP
PHP实现微信公众号验证Token的示例代码
Dec 16 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优于Node.js的五大理由分享
2012/09/15 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
php实现随机显示图片方法汇总
2015/05/21 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
Javascript 实现复制(Copy)动作方法大全
2014/06/20 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
nodejs个人博客开发第七步 后台登陆
2017/04/12 NodeJs
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
vue-cli设置publicPath小记
2020/04/14 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
获取python文件扩展名和文件名方法
2018/02/02 Python
python语音识别实践之百度语音API
2018/08/30 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
python怎么判断素数
2020/07/01 Python
利用python 下载bilibili视频
2020/11/13 Python
英国外籍人士的在线超市:British Corner Shop
2019/06/03 全球购物
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
工程力学专业毕业生求职信
2013/10/06 职场文书
会计自荐书
2013/12/02 职场文书
护理专业自我鉴定
2014/01/30 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
鼋头渚导游词
2015/02/05 职场文书
奔腾年代观后感
2015/06/09 职场文书
新生儿未入户证明
2015/06/23 职场文书
2015年教务主任工作总结
2015/07/22 职场文书