tp5 数据库账号密码正确的情况下,报错PDOException in Connection.php

2020-07-13

数据库账号密码正确,但是tp确有时报错PDOException in Connection.php 293(账号密码错误),在查看tp的日志时发现一个错误

[ error ] [2002]SQLSTATE[HY000] [2002] 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。

通过百度,查询到问题所在:

通过cmd命令  netstat -ano 查询 发现很多 time_wait的tcp连接

通过netsh int ipv4 show dynamicport tcp查看  tcp动态端口的启动端口和端口数;

当请求过多将所有动态端口占用时就会导致上面的问题

解决方法

方法1:重启服务器,但是在运行一段时间后可能还会出现这样的问题

方法2:通过修改TIME_WAIT的时间,快速的释放资源,并修改tcp的动态端口范围来使服务器能够支持更多的请求访问

以Administrator用户登录Windows操作系统。
修改TCP回收时间。
在Windows开始菜单中,单击“运行”。
在“运行”对话框中,输入“regedit”后按“Enter”打开注册表编辑器。
在“注册表编辑器”中打开“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters”路径。
在“编辑”菜单中,选择“新建 > DWORD (32-位)值”,输入名称“TcpTimedWaitDelay”。
右键单击TcpTimedWaitDelay,选择“修改”。
在“编辑 DWORD(32位)值”对话框的“基数”区域中,选择十进制值为“30”,并“确定”。
关闭注册表编辑器。
修改端口范围。
在Windows开始菜单中,单击“运行”。
输入“cmd”并按“Enter”打开命令执行窗口。
执行如下命令修改端口范围。
netsh int ipv4 set dynamicportrange tcp startport=5000 numberofports=60000
重启操作系统。

什么是time_wait:

FIN_WAIT_1: FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。

FIN_WAIT_2:实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。

TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。(2MSL有可能是 30秒、1分钟、2分钟或者4分钟。不同的发行版可能会不同

更多关于time_wait的详解(https://blog.csdn.net/huangyimo/article/details/81505558https://www.cnblogs.com/rexcheny/p/11143128.html

文章来源于:https://my.oschina.net/mymxd/blog/541851

{/if}