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实现小型站点广告管理(修正版)
Oct 09 PHP
PHP 危险函数全解析
Sep 09 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
Dec 02 PHP
php中经典方法实现判断多维数组是否为空
Oct 23 PHP
CI框架源码阅读,系统常量文件constants.php的配置
Feb 28 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
Dec 14 PHP
Ajax+PHP实现的分类列表框功能示例
Feb 11 PHP
Yii框架分页技术实例分析
Aug 30 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
Oct 12 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 PHP
通过代码实例解析PHP session工作原理
Dec 11 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
德劲1104的电路分析与改良
2021/03/01 无线电
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
Laravel5中contracts详解
2015/03/02 PHP
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
jQuery插件实现大图全屏图片相册
2015/03/14 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
学习Angularjs分页指令
2016/07/01 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
2017/12/14 Javascript
javascript性能优化之分时函数的介绍
2018/03/28 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
Ubuntu下使用python读取doc和docx文档的内容方法
2018/05/08 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
如何在Python对Excel进行读取
2020/06/04 Python
python 如何停止一个死循环的线程
2020/11/24 Python
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
学生出入校管理制度
2014/01/16 职场文书
索桥的故事教学反思
2014/02/06 职场文书
优秀教师工作感言
2014/02/16 职场文书
进步之星获奖感言
2014/02/22 职场文书
导游词范文
2015/02/13 职场文书
教导主任个人总结
2015/03/03 职场文书
小升初自荐信范文
2015/03/05 职场文书
毕业欢送会致辞
2015/07/29 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android
java版 简单三子棋游戏
2022/05/04 Java/Android
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技