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生成文件
Jan 15 PHP
一步一步学习PHP(2)――PHP类型
Feb 15 PHP
很让人受教的 提高php代码质量36计
Sep 05 PHP
php中simplexml_load_string使用实例分享
Feb 13 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
Jan 07 PHP
WampServer搭建php环境时遇到的问题汇总
Jul 23 PHP
Yii框架弹出框功能示例
Jan 07 PHP
PHP设计模式之观察者模式定义与用法示例
Aug 04 PHP
Laravel框架实现定时发布任务的方法
Aug 16 PHP
PHP session垃圾回收机制实例分析
Jun 28 PHP
Smarty模板语法详解
Jul 20 PHP
Yii框架常见缓存应用实例小结
Sep 09 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
特详细的PHPMYADMIN简明安装教程
2008/08/01 PHP
array_multisort实现PHP多维数组排序示例讲解
2011/01/04 PHP
PHP中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
2016/01/15 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
javascript的内存管理详解
2013/08/07 Javascript
js替代copy(示例代码)
2013/11/27 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
对Angular.js Controller如何进行单元测试
2016/10/25 Javascript
第一次接触神奇的前端框架vue.js
2016/12/01 Javascript
Vue中fragment.js使用方法详解
2017/03/09 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
seajs和requirejs模块化简单案例分析
2019/08/26 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
python机器学习理论与实战(二)决策树
2018/01/19 Python
Python编程求质数实例代码
2018/01/31 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
python实现单张图像拼接与批量图片拼接
2020/03/23 Python
解决Python在导入文件时的FileNotFoundError问题
2020/04/10 Python
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
求职者简历中的自我评价
2013/10/20 职场文书
幼儿园门卫岗位职责
2014/02/14 职场文书
教研活动总结
2014/04/28 职场文书
2014教师党员个人自我评议
2014/09/20 职场文书
公务员考察材料
2014/12/23 职场文书
党支部意见范文
2015/06/02 职场文书
python之基数排序的实现
2021/07/26 Python
python中if和elif的区别介绍
2021/11/07 Python
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL