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学习 变量使用总结
Mar 24 PHP
thinkPHP的Html模板标签使用方法
Nov 13 PHP
PHP自动识别字符集并完成转码详解
Aug 02 PHP
PHP获取当前url的具体方法全面解析
Nov 26 PHP
一个php短网址的生成代码(仿微博短网址)
May 07 PHP
php打印输出棋盘的实现方法
Dec 23 PHP
PHP Static延迟静态绑定用法分析
Mar 16 PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 PHP
php PDO判断连接是否可用的实现方法
Apr 03 PHP
php通过pecl方式安装扩展的实例讲解
Feb 02 PHP
PHP receiveMail实现收邮件功能
Apr 25 PHP
PHP实现简易图形计算器
Aug 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
在数据量大(超过10万)的情况下
2007/01/15 PHP
php获取bing每日壁纸示例分享
2014/02/25 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
php创建图像具体步骤
2017/03/13 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
使用jQuery异步加载 JavaScript脚本解决方案
2014/04/20 Javascript
有效提高JavaScript执行效率的几点知识
2015/01/31 Javascript
浅谈Cookie的生命周期问题
2016/08/02 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
2018/01/12 Javascript
Vuex的基本概念、项目搭建以及入坑点
2018/11/04 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
2020/12/25 Vue.js
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
python使用post提交数据到远程url的方法
2015/04/29 Python
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
《与孩子一起学编程》python自测题
2018/05/27 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
使用Html5多媒体实现微信语音功能
2019/07/26 HTML / CSS
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
新春寄语大全
2014/04/09 职场文书
毕业生面试求职信
2014/06/23 职场文书
国庆节活动总结
2014/08/26 职场文书
法定代表人身份证明书
2015/06/18 职场文书
MySQL 开窗函数
2022/02/15 MySQL