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截取汉字乱码问题解决方法mb_substr函数的应用
Mar 30 PHP
PHP中for与foreach的区别分析
Mar 09 PHP
php笔记之:AOP的应用
Apr 24 PHP
使用php 获取时间今天明天昨天时间戳的详解
Jun 20 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
Dec 24 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
Jan 27 PHP
PHP 7.1新特性的汇总介绍
Dec 16 PHP
PHP常用操作类之通信数据封装类的实现
Jul 16 PHP
PHP实现的策略模式简单示例
Aug 25 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
php中curl和soap方式请求服务超时问题的解决
Jun 11 PHP
Laravel 框架路由原理与路由访问实例分析
Apr 14 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 $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
php之curl实现http与https请求的方法
2014/10/21 PHP
简单介绍win7下搭建apache+php+mysql开发环境
2015/08/06 PHP
PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
2019/06/08 PHP
javascript开发技术大全 第4章 直接量与字符集
2011/07/03 Javascript
初识SmartJS - AOP三剑客
2014/06/08 Javascript
jQuery中scrollTop()方法用法实例
2015/01/16 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
nginx配置React静态页面的方法教程
2017/11/03 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
vue视频播放暂停代码
2019/11/08 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
EXTJS7实现点击拖拉选择文本
2020/12/17 Javascript
Python IDLE入门简介
2017/12/08 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
20行python代码的入门级小游戏的详解
2019/05/05 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
python re模块常见用法例举
2021/03/01 Python
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
村官学习十八大感想
2014/01/15 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
开展警示教育活动总结
2015/05/09 职场文书
交通事故起诉书
2015/05/19 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
2019求职信大礼包
2019/05/15 职场文书
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python