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 图片加水印与上传图片加水印php类
May 12 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
PHP设计模式之适配器模式代码实例
May 11 PHP
常见的四种POST 提交数据方式(小总结)
Oct 08 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
Dec 09 PHP
php数组冒泡排序算法实例
May 06 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
May 13 PHP
py文件转exe时包含paramiko模块出错解决方法
Aug 12 PHP
thinkphp配置文件路径的实现方法
Aug 30 PHP
php 修改上传文件大小限制实例详解
Oct 23 PHP
Yii2 批量插入、更新数据实例
Mar 15 PHP
PHP面向对象多态性实现方法简单示例
Sep 27 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
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
动态添加删除表格行的js实现代码
2014/02/28 Javascript
javascript继承机制实例详解
2014/11/20 Javascript
Javascript递归打印Document层次关系实例分析
2015/05/15 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
ashx文件获取$.ajax()方法发送的数据
2016/05/26 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
2017/05/10 Javascript
jQuery+ajax实现修改密码验证功能实例详解
2017/07/06 jQuery
关于 angularJS的一些用法
2017/11/29 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
2018/07/26 Javascript
VUE引入第三方js包及调用方法讲解
2019/03/01 Javascript
微信小程序-可移动菜单的实现过程详解
2019/06/24 Javascript
vue实现移动端省市区选择
2019/09/27 Javascript
Ant Design的可编辑Tree的实现操作
2020/10/31 Javascript
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
Python Flask前后端Ajax交互的方法示例
2018/07/31 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
Python3 filecmp模块测试比较文件原理解析
2020/03/23 Python
详解Python IO编程
2020/07/24 Python
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
个人求职信范文分享
2014/01/06 职场文书
社团招新策划书
2014/02/04 职场文书
房屋过户委托书范本
2014/10/07 职场文书
离婚协议书格式
2014/11/21 职场文书
教师旷工检讨书
2015/08/15 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
2021/06/22 Python
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js