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中cookie的作用域
Mar 27 PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 PHP
彻底删除thinkphp3.1案例blog标签的方法
Dec 05 PHP
php下Memcached入门实例解析
Jan 05 PHP
浅谈COOKIE和SESSION区别
Jul 19 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 PHP
Discuz论坛密码与密保加密规则
Dec 19 PHP
thinkPHP5.0框架URL访问方法详解
Mar 18 PHP
如何修改Laravel中url()函数生成URL的根地址
Aug 11 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
php微信开发之关注事件
Jun 14 PHP
PHP数组对象与Json转换操作实例分析
Oct 22 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实现视频文件上传完整实例
2014/08/28 PHP
php控制文件下载速度的方法
2015/03/24 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
php使用PDO获取结果集的方法
2017/02/16 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
JavaScript中的异常捕捉介绍
2014/12/31 Javascript
JS常用算法实现代码
2016/11/14 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
2018/01/03 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
angular4应用中输入的最小值和最大值的方法
2019/05/17 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
2019/06/21 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
Python中atexit模块的基本使用示例
2015/07/08 Python
Python制作爬虫采集小说
2015/10/25 Python
Python中的异常处理相关语句基础学习笔记
2016/07/11 Python
Python 异常处理的实例详解
2017/09/11 Python
scrapy爬虫实例分享
2017/12/28 Python
对python当中不在本路径的py文件的引用详解
2018/12/15 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
Python 使用matplotlib模块模拟掷骰子
2019/08/08 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
Python 读取位于包中的数据文件
2020/08/07 Python
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
给孩子的新年寄语
2014/04/08 职场文书
求职自我推荐信
2014/06/25 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
校友回访母校寄语
2015/02/26 职场文书