mysqli php随机连接错误

时间:2016-11-11 01:50:55

标签: php mysql mysqli mysqladmin

我从php后端作业和php网页日志中随机收到以下错误。有一个运行php后端作业和php网络服务器的应用服务器。两者都连接到同一个数据库服务器。使用php mysqli面向对象的库来连接数据库。在my.cnf中将最大连接数设置为750。没有看到达到很多连接。

  

PHP警告:mysqli :: mysqli():( HY000 / 2003):无法在/usr/local/dev/classes/Admin.php上的'77 .777.120.81'(99)上连接到MySQL服务器15

     

无法连接到MySQL:无法连接到'77 .777.120.81上的MySQL服务器'(99)

3 个答案:

答案 0 :(得分:6)

正如本Percona Database Performance Blog文章中所述,您的问题是您的应用程序无法打开与MySQL服务器的另一个连接。您的本地TCP端口已用完。作为一种解决方案,我建议调整TCP参数设置

  • tcp_tw_reuse(布尔值;默认值:禁用;自Linux 2.4.19 / 2.6起)           允许在新连接时重用TIME_WAIT套接字           从协议的角度看是安全的。它不应该改变           没有技术专家的建议/要求。

      

    通过将/ proc / sys / net / ipv4 / tcp_tw_reuse设置为1,可以强制内核重用挂在TIME_WAIT状态的连接。实际情况是,您将继续看到TIME_WAIT中挂起的已关闭连接直到它们到期或请求新连接。在后一种情况下,连接将“重新获得”。

  • tcp_tw_recycle(布尔值;默认值:禁用;自Linux 2.4起)           实现TIME_WAIT套接字的快速回收。启用此功能           不建议使用选项,因为这会导致问题           使用NAT(网络地址转换)。
      

    启用/ proc / sys / net / ipv4 / tcp_tw_recycle时,关闭连接将不再显示在TIME_WAIT下 - 它们将完全从netstat中消失。但是一旦你打开一个新的连接(在60秒内),它将回收其中一个。但是每个人都在撰写关于这种替代方案的文章,似乎建议不要使用它。底线是:重用连接比回收它更好。

  • tcp_max_tw_buckets(整数;默认:见下文;自Linux 2.4起)           允许的TIME_WAIT状态的最大套接字数           系统。此限制仅用于防止简单拒绝 -           服务攻击。 NR_FILE * 2的默认值是           根据系统中的内存进行调整。如果这           超过数字,套接字关闭并发出警告           打印。
      

    此参数规定可以同时保持TIME_WAIT状态的连接数:内核将   简单地杀死悬挂在该数字之上的状态的连接。例如,在服务器具有仅由6个端口组成的TCP端口范围的情况下,如果/proc/sys/net/ipv4/tcp_max_tw_buckets设置为5,则打开与MySQL的6个并发连接,然后立即关闭所有6个,您将只找到5个它们挂在TIME_WAIT状态 - 与tcp_tw_recycle一样,其中一个将从netstat输出中消失。这种情况允许立即打开新连接,而无需等待分钟* 。   

        
    • 在连接到数据库服务器时,许多应用程序选择仅为单个请求打开新连接,在处理请求后立即关闭它。即使连接被客户端(应用程序)关闭,它正在使用的本地端口也不会被操作系统立即释放以供另一个连接重用:它将处于TIME_WAIT状态(通常)为60秒 - 此值不能为很容易改变,因为它在内核中是硬编码的。

      

    但是,在TIME_WAIT中的其他5个连接之一到期并释放它正在使用的本地端口之前,第二个连接将无法打开。那么,这里的秘密是在可用网络端口数量和允许保持TIME_WAIT状态的连接数之间找到折衷方案。此设置的默认值为65536,这意味着默认情况下系统允许所有可能的连接在关闭时超过TIME_WAIT状态。

PS:您的问题有更多可能的解决方案,请阅读完整文章以了解问题的详细说明。

答案 1 :(得分:1)

更新1

tcp_tw_reuse看起来更好解决方案。这里描述了原因:

  

tcp_tw_reuse vs tcp_tw_recycle : Which to use (or both)?

原始回答

mysql错误(99)表示您的tcp端口不足。

启用tcp recycle应修复它。

echo 1 >/proc/sys/net/ipv4/tcp_tw_recycle 

Credits

答案 2 :(得分:-2)

参考refer

我能够从本地shell连接,所以首先想到的是,如果最近的Zend Framework升级有问题,但过了一段时间我发现答案非常简单 - SELinux阻止了Apache web执行的PHP脚本的远程连接服务器。错误消息末尾的错误代码(13)表示“权限被拒绝”,这是指示您是否有类似问题的指示。

无论如何,以root身份登录并执行

setsebool -P httpd_can_network_connect=1

让它发挥作用。

当然,请三思而后行,因为您使Web服务器的安全性降低,所以除非您确定需要,否则请不要这样做。