从【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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • QueryInterface的本质初探

    QueryInterface的本质初探转载请注明出处,版权归作者所有 lyzaily@126.comyanzhong.lee  本文写给COM的初学者!QueryInterface接口对COM的重要性不言而喻,该接口的实现有个规则——由QueryInterface返回的IUnknow接口指针必须相同,我的疑问是微软是如何使用C++实现这一COM规则的呢?请读者注意,我只探讨微软使用C++

    2022年7月21日
    7
  • springboot启动方式_启动会启动仪式

    springboot启动方式_启动会启动仪式我想很多人已经在项目中使用SpringBoot做项目开发的工作了,创建SpringBoot和启动SpringBoot应用都会较简单一点,下面我以SpringBoot官网上的Demo来简单的分析一些SpringBoot的启动流程,我们的启动主类代码如下:@SpringBootApplicationpublicclassSpringBootAnalysisApplication{publ

    2022年9月11日
    0
  • Response.ContentType 详细列表

    Response.ContentType 详细列表Response.ContentType详细列表不同的ContentType会影响客户端所看到的效果.默认的ContentType为text/html也就是网页格式.代码如:显示的为网页,而则会显示html原代码.以下为一些常用的ContentTypeGIFimagesJPEG

    2022年7月19日
    14
  • 基于Java开发的testNG接口自动化测试

    基于Java开发的testNG接口自动化测试1.TestNG简介TestNG是一个开源的测试框架与Junit的发行顺序:Junit3->TestNG->Junit4,TestNG的灵感来自于Junit3,在TestNG推出不久后,Junit借鉴了其中很多概念,也推出了差不多四年以来首个发行版本Junit4。所以,TestNG跟JUnit4很像,但它并不是JUnit的扩展,它的创建目的是超越Junit。TestNG具有更强…

    2022年10月23日
    0
  • 配置gitignore后使其生效命令

    配置gitignore后使其生效命令

    2021年10月20日
    41
  • 2016西安教师职称计算机考试,2016教师职称计算机考试模块.doc[通俗易懂]

    2016西安教师职称计算机考试,2016教师职称计算机考试模块.doc[通俗易懂]2016教师职称计算机考试模块2015年教师职称计算机考试模块【职考宝典】为广大考生归纳2015年职称计算机考试模块,让考生提前进入考试氛围,了解考试题型,职考宝典涵盖面积广,模拟题库包含Internet应用,word2003、2007,winXP、wpsoffice、excel2003、2007,ppt2003、2007等。山东广东安徽内蒙古黑龙江湖南山西云南辽宁新疆浙江江西湖北广西甘肃陕西…

    2022年5月8日
    35

发表回复

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

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