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 获取本地IP代码
Jun 23 PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 PHP
curl和libcurl的区别简介
Jul 01 PHP
PHP创建PowerPoint2007文档的方法
Dec 10 PHP
PHP-FPM实现性能优化
Mar 31 PHP
PHP实现简单实用的分页类代码
Apr 08 PHP
CI框架集成Smarty的方法分析
May 17 PHP
php微信高级接口群发 多客服
Jun 23 PHP
浅谈关于PHP解决图片无损压缩的问题
Sep 01 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
Oct 08 PHP
解析laravel使用workerman用户交互、服务器交互
Apr 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
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
2016/01/19 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
使用javascript获取页面名称
2014/12/23 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
Sea.JS知识总结
2016/05/05 Javascript
jQuery事件用法详解
2016/10/06 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
纯javascript实现选择框的全选与反选功能
2019/04/08 Javascript
layer弹出层自适应高度,垂直水平居中的实现
2019/09/16 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
python中判断文件编码的chardet(实例讲解)
2017/12/21 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
python中aioysql(异步操作MySQL)的方法
2019/04/11 Python
Python flask框架实现查询数据库并显示数据
2020/06/04 Python
什么是python的id函数
2020/06/11 Python
python中remove函数的踩坑记录
2021/01/04 Python
基于HTML5的WebSocket的实例代码
2018/08/15 HTML / CSS
html5菜单折纸效果
2014/04/22 HTML / CSS
linux面试题参考答案(4)
2013/01/28 面试题
服务中心夜班服务员岗位职责
2013/11/27 职场文书
平面设计岗位职责
2013/12/14 职场文书
党的群众路线教育实践活动对照检查剖析材料
2014/10/09 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
成绩单评语
2015/01/04 职场文书
中学教师个人总结
2015/02/10 职场文书
HTML5+CSS+JavaScript实现捉虫小游戏设计和实现
2021/10/16 HTML / CSS
Vscode中SSH插件如何远程连接Linux
2022/05/02 Servers
MySQL事务的ACID特性以及并发问题方案
2022/07/15 MySQL