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 radio 单选框获取与保持值的实现代码
May 15 PHP
php知道与问问的采集插件代码
Oct 12 PHP
基于php验证码函数的使用示例
May 03 PHP
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
php批量删除cookie的简单实现方法
Jan 26 PHP
Ajax实现对静态页面的文章访问统计功能示例
Oct 10 PHP
iis6手工创建网站后无法运行php脚本的解决方法
Jun 08 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
Dec 21 PHP
laravel批量生成假数据的方法
Oct 09 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 PHP
基于php伪静态的实现方法解析
Jul 31 PHP
基于PHP实现邮箱验证激活过程详解
Oct 28 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
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
ThinkPHP 模板引擎使用详解
2017/05/07 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
jquery事件与函数的使用介绍
2013/09/29 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
详解webpack中的hash、chunkhash、contenthash区别
2018/01/05 Javascript
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
ES6入门教程之变量的解构赋值详解
2019/04/13 Javascript
JavaScript 处理树数据结构的方法示例
2019/06/16 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
python中关于日期时间处理的问答集锦
2013/03/08 Python
Python 创建子进程模块subprocess详解
2015/04/08 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
Django Haystack 全文检索与关键词高亮的实现
2020/02/17 Python
python解析xml文件方式(解析、更新、写入)
2020/03/05 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
如何开启linux的ssh服务
2015/02/14 面试题
物流管理专业应届生求职信
2013/11/21 职场文书
2014小学二年级班主任工作总结
2014/12/05 职场文书
寒山寺导游词
2015/02/03 职场文书
情人节活动总结范文
2015/02/05 职场文书
文言文辞职信
2015/02/28 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
教师远程研修感悟
2015/11/18 职场文书
公司晚会主持词
2019/04/17 职场文书
CPU不支持Windows11系统怎么办
2021/11/21 数码科技