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 相关文章推荐
用IE远程创建Mysql数据库的简易程序
Oct 09 PHP
在线竞拍系统的PHP实现框架(二)
Oct 09 PHP
PHP聊天室技术
Oct 09 PHP
php实现在多维数组中查找特定value的方法
Jul 29 PHP
PHP实现可自定义样式的分页类
Mar 29 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 PHP
thinkPHP5.0框架URL访问方法详解
Mar 18 PHP
laravel 5.4中实现无限级分类的方法示例
Jul 27 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 PHP
基于laravel-admin 后台 列表标签背景的使用方法
Oct 03 PHP
在thinkphp5.0路径中实现去除index.php的方式
Oct 16 PHP
PHP替换Word中变量并导出PDF图片的实现方法
Nov 26 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
关于Iframe如何跨域访问Cookie和Session的解决方法
2013/04/15 PHP
php中动态修改ini配置
2014/10/14 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
WordPress开发中的get_post_custom()函数使用解析
2016/01/04 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
2015/08/18 Javascript
JavaScript学习小结(一)——JavaScript入门基础
2015/09/02 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
Bootstrap3.0学习教程之JS折叠插件
2016/05/27 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
几行js代码实现自适应
2017/02/24 Javascript
vue axios用法教程详解
2017/07/23 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
利用vue3+ts实现管理后台(增删改查)
2020/10/30 Javascript
python with statement 进行文件操作指南
2014/08/22 Python
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
css3实现背景图片拉伸效果像桌面壁纸一样
2013/08/19 HTML / CSS
css3中transition属性详解
2014/09/02 HTML / CSS
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
Marc Jacobs官方网站:美国奢侈品牌
2017/08/29 全球购物
Happy Socks英国官网:购买五颜六色的袜子
2020/11/03 全球购物
公司JAVA开发面试题
2015/04/02 面试题
家长学校实施方案
2014/03/15 职场文书
高中生操行评语大全
2014/04/25 职场文书
建筑安全标语
2014/06/07 职场文书
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers