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音乐采集(部分代码)
Feb 14 PHP
PHP 用数组降低程序的时间复杂度
Dec 04 PHP
php图片上传存储源码并且可以预览
Aug 26 PHP
codeigniter数据库操作函数汇总
Jun 12 PHP
php简单获取文件扩展名的方法
Mar 24 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
PHP+Ajax 检测网络是否正常实例详解
Dec 16 PHP
Yii框架表单提交验证功能分析
Jan 07 PHP
Yii2实现中国省市区三级联动实例
Feb 08 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
Mar 31 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
Oct 17 PHP
PHP学习记录之常用的魔术常量详解
Dec 12 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 批量替换程序的具体实现代码
2013/10/04 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
php实现将上传word文件转为html的方法
2015/06/03 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
javascript对象的property和prototype是这样一种关系
2007/03/24 Javascript
asp.net 30分钟掌握无刷新 Repeater
2011/09/16 Javascript
再说AutoComplete自动补全之实现原理
2011/11/05 Javascript
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
javascript实现仿百度图片的瀑布流加载效果
2016/04/20 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
vue项目中引入noVNC远程桌面的方法
2018/03/05 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
VUE : vue-cli中去掉路由中的井号#操作
2020/09/04 Javascript
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
python放大图片和画方格实现算法
2018/03/30 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
python高阶爬虫实战分析
2018/07/29 Python
简单了解django索引的相关知识
2019/07/17 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
Python包和模块的分发详细介绍
2020/06/19 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
巴西宠物商店:Cobasi
2019/04/19 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
创立科技Java面试题
2015/11/29 面试题
微信营销策划方案
2014/02/24 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
2015年招生工作总结
2015/05/04 职场文书
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle