从【MySQL server has gone away】说起[通俗易懂]

从【MySQL server has gone away】说起

大家好,又见面了,我是全栈君。

本文目的

这几天开发了一个PHP CLI程序,用于后台定时调度执行一些任务。此脚本采用了PHP的多进程(pcntl_fork),共享内存和信号量进行IPC和同步。目的是将串行的任务并行执行,缩短执行时间。可是在工作子进程中,访问myql时一直报错,通过mysql_error返回的信息却是冷冷的一句话“MySQL server has gone away”。简单说一句自己挂掉了就完事,太不负责任了。经过仔细搜索,终于发现问题的原因,在此做个分享,也作为备忘。

什么导致“MySQL server has gone away”

官方文档描述,主要有以下一些原因导致此异常出现(我粗略的翻译一下,以原文为准):

1. mysqld线程被杀死.

2. 使用了关闭的链接资源

3. 无权限

4. TCP/IP超时

5. mysql服务器端超时

6. windows兼容问题

7. sql过长

8. 请求包过长

9. DNS解析问题

10. 多进程并发使用同一个链接

11. mysql的未知bug

吐槽:以上情况虽然列举得很详细,但是为什么不能在第一时间通过mysql_error返回呢?

问题的原因

由于我的使用场景是在多进程环境下,所以很快将问题锁定在了mysql链接资源上,果然很快找到答案:mysql_connect函数的第四个参数$new_link没有设置为true.

首先看看mysql_connect函数签名:

resource mysql_connect ([ string $server = ini_get(“mysql.default_host”) [, string $username = ini_get(“mysql.default_user”) [, string$password = ini_get(“mysql.default_password”) [, bool $new_link = false [, int $client_flags = 0 ]]]]] )

默认情况,$new_link设置为false,也就是会重用现有的链接资源(如果有)。设想一下,如果多个进程同时调用mysql_connect,并且没有设置$new_link为true,那么这些进程就会同时使用同一个链接资源,也就是上面第10个原因,导致mysql报告“mysql server has gone away”的异常。

所以,将$new_link设置为true后,此问题就解决了。

问题的本质

mysql链接资源,底层其实是封装了socket和相关的数据,如果多个进程用一个链接,也就是同一个socket和服务器交互,结果可想而知,服务器被混淆了,所以只能吐出一句冷冷的“MySQL server has gone away”了事。

但是,我还有一个疑问,php在apache环境下访问mysql时,并没有显示设置$new_link为True,但是从没有出现上述这个现象,难道是apache处理并发时,采用的单进程而不是多进程?

总结

初次涉及多进程相关开发,往往遇到许多莫名奇妙的问题,有些现象时有时无。这时候,一定冷静分析问题的现象,不要随意将责任推究给其他系统(比如linux,mysql等),而是要在自己的程序上找原因。

在刚遇到此问题时,由于一时没有找到问题的原因,我还怀疑过是mysql的性能太低,不能承受我的程序的并发。其实这是一种出于本能的自我安慰。mysql的并发性能在业绩是有口皆碑的,怎么会在我的几个进程面前倒下。经过一番网上搜素和思考,终于找到问题原因,现在可以松一口气了。

值得高兴的是,程序改成并发后,性能有了质的飞跃,执行时间缩小到原来的十分之一,系统使用率高达90%多,改进前不到10%。

声明:如有转载本博文章,请注明出处。您的支持是我的动力!文章部分内容来自互联网,本人不负任何法律责任。
本文转自bourneli博客园博客,原文链接:http://www.cnblogs.com/bourneli/archive/2012/08/02/2620406.html
,如需转载请自行联系原作者

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108101.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ebpf原理分析_HRTEM怎么分析

    ebpf原理分析_HRTEM怎么分析ebpf原理解析

    2022年9月21日
    4
  • Layui弹出层 加载 做编辑页面「建议收藏」

    Layui弹出层 加载 做编辑页面「建议收藏」先上效果图基本准备,引入layui的layui.css,layui.js文件<linkrel="stylesheet"href="../../../Publics/others/layui/css/layui.css"media="all"><scriptsrc="../../../Publics/others/layui/layui.js">&a

    2022年5月26日
    69
  • c++反转链表中m位置到n位置的元素_环形数组最大子数组

    c++反转链表中m位置到n位置的元素_环形数组最大子数组原题链接给定一个由整数数组 A 表示的环形数组 C,求 C 的非空子数组的最大可能和。在此处,环形数组意味着数组的末端将会与开头相连呈环状。(形式上,当0 <= i < A.length 时 C[i] = A[i],且当 i >= 0 时 C[i+A.length] = C[i])此外,子数组最多只能包含固定缓冲区 A 中的每个元素一次。(形式上,对于子数组 C[i], C[i+1], …, C[j],不存在 i <= k1, k2 <= j 其中 k1 % A.leng

    2022年8月9日
    14
  • Android入门学习教程PDF免费下载

    Android入门学习教程PDF免费下载场景Android(安卓)是一种以Linux为基础的开放源码操作系统,主要使用于便携设备。2005年由Google收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。实现关注公众号:霸道的程序猿回复:Android书籍免费下载。…

    2022年5月10日
    41
  • linux手动安装gcc-5.1.0「建议收藏」

    linux手动安装gcc-5.1.0「建议收藏」yum源和apt-get源安装linux下安装gcc和g++时,可以使用源安装,例如:yuminstallgcc或者apt-getinstallgcc,但是这有个缺点,就是可能不能安装到你想要的版本,因此我们需要手动安装。下载gcc不同版本gcc是gnu的产品,所以我们可以去gnu官网去下,但是gnu下载的比减慢,这里提供一些大学的软件开元镜像源,比如清华大学:清华大学开元镜像源…

    2022年5月26日
    41
  • 对于java二维数组初始化的理解[通俗易懂]

    对于java二维数组初始化的理解[通俗易懂]1.初始化:在定义变量之后,系统为变量分配的空间内存储的值是不确定的,所以要对这个空间进行初始化以确保程序的安全性和确定性2.给二维数组元素赋值:b[0]={1,2,3}//Arrayconstantscanonlybeusedininitializers数组常量只能被用于初始化,初始化动作在编译时完成。b[0]=newint[]{1,2}//赋值newin…

    2022年5月25日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号