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 计算两个时间戳相隔的时间的函数(小时)
Dec 18 PHP
PHP模块 Memcached功能多于Memcache
Jun 14 PHP
支持中文字母数字、自定义字体php验证码代码
Feb 27 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
Jan 22 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
Apr 10 PHP
PHP使用递归方式列出当前目录下所有文件的方法
Jun 02 PHP
必须收藏的23个php实用代码片段
Feb 02 PHP
php基于curl重写file_get_contents函数实例
Nov 08 PHP
PHP使用curl函数发送Post请求的注意事项
Nov 26 PHP
PHP实现数据库的增删查改功能及完整代码
Apr 18 PHP
php用wangeditor3实现图片上传功能
Aug 22 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程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
php自动注册登录验证机制实现代码
2011/12/20 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
php上传文件并显示上传进度的方法
2015/03/24 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
实例讲解PHP表单
2020/06/10 PHP
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
JavaScript数据类型的存储方法详解
2017/08/25 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
浅谈Webpack打包优化技巧
2018/06/12 Javascript
vue实现循环切换动画
2018/10/17 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
WEEX环境搭建与入门详解
2019/10/16 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
Swiper实现导航栏滚动效果
2020/10/16 Javascript
vant 中van-list的用法说明
2020/11/11 Javascript
vue中配置scss全局变量的步骤
2020/12/28 Vue.js
[41:52]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第二场 2月22日
2021/03/11 DOTA
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
用Python将IP地址在整型和字符串之间轻松转换
2017/03/22 Python
python反编译学习之字节码详解
2019/05/19 Python
Pandas之Fillna填充缺失数据的方法
2019/06/25 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
Python实现直播推流效果
2019/11/26 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
python 绘制场景热力图的示例
2020/09/23 Python
python绘制雷达图实例讲解
2021/01/03 Python
HTML5仿微信聊天界面、微信朋友圈实例代码
2018/01/29 HTML / CSS
详解Html5 监听拦截Android返回键方法
2018/04/18 HTML / CSS
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
情侣吵架检讨书
2014/02/05 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书
如何写好闭幕词
2019/04/02 职场文书