错误:"mysqli :: real_connect():(HY000/2002):仅允许...。"

6
错误信息:

mysqli_real_connect(): (HY000/2002): 通常情况下,每个套接字地址(协议/网络地址/端口)只允许使用一次。

然而,看起来我有足够的端口

详情:

我有一个运行了数月没有问题的MySQL服务器。我正在运行Windows 10,PHP 7.0和MySQL 5.7。这是一个繁忙的服务器,每小时处理高交易量。

大约一周以来,我一直收到大量的以下错误信息:

mysqli_real_connect(): (HY000/2002): 通常情况下,每个套接字地址(协议/网络地址/端口)只允许使用一次。

我尝试了一些常见的建议,但这些建议在其他机器上对我有效。

TcpTimedWaitDelay = 30 and MaxUserPort = 65534

我也添加了:
TcpNumConnections = 16777214 and TcpMaxDataRetransmissions = 5.

我可以通过netsh确认最大端口和超时时间。此外,当我运行netstat /abno时,我始终看到使用的端口少于1000个。然而,我仍然收到以上错误。因此,似乎机器甚至没有使用所有端口。
在我的.ini文件中,我有一个10,000连接限制。

更新:通过更积极地重用数据库连接并 consololidating 查询,我已经成功地显著减少了问题。然而,我仍然困惑于为什么我会达到限制,而 TCP 端口似乎是充足的。 - user9158661
1个回答

1
所以这似乎是一个 Windows问题,而不是MySQLi的问题。(可能是由于最近的Windows 10更新),但也可能是由于套接字没有正确关闭。
解决方法1:增加更多端口
启动regedit.exe并浏览到:HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort 有一个字符串值,默认设置为5000,它确定可用端口的最大数量。您可以将其更改为任何65534以下的值。
确保您重新启动Web服务器(最好是整个机器)以使更改生效。
解决方法2:明确指定本地IP
任何连接到本地主机都应该指定为127.0.0.1,而不是localhost
解决方法3:确认没有重复服务
请检查是否有多个Web服务器实例运行,或多次调用打开与该服务器的连接 - 这会锁定端口。打开services.msc - 如果存在重复服务,则应删除一个实例。
修复方法4:您是否正确关闭连接?
如果可以,请发布您的代码,以便我们更好地了解发生了什么情况 - 以及连接是否被正确关闭,从而释放套接字/端口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接