MySQL/PHP 错误:[2002] 每个套接字地址(协议/网络地址/端口)通常只允许使用一次

Posted

技术标签:

【中文标题】MySQL/PHP 错误:[2002] 每个套接字地址(协议/网络地址/端口)通常只允许使用一次【英文标题】:MySQL/PHP Error:[2002] Only one usage of each socket address (protocol/network address/port) is normally permitted 【发布时间】:2012-05-06 06:34:35 【问题描述】:

我已经在 *** 上找不到解决方案,大多数其他相关主题都与 Apache 没有先启动并出现此错误有关。我的问题是,在 apache 运行后,我的一些连接到我们的 php/mysql 网站的用户会收到此错误:

PHP Warning:  mysql_connect() [function.mysql-connect]:
[2002] Only one usage of each socket address (protocol/network address/port)
is normally permitted.

这似乎完全是随机的,当我监控 Apache 的工作线程时,通常有很多空闲的工作人员可以接受新的连接/请求。

我的网站在 Windows XP SP3、Xampp 1.7.7、四核、4gigs 内存、1TB HD、php/mysql 规格上运行:

Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1

任何关于我应该在我的任何配置中进行更改以使其消失的帮助将不胜感激。我在 google 甚至 Xampp 论坛上查看过,但大多数人在启动 Apache 之前都会遇到此问题,但当用户遇到此错误时,Apache 对我来说运行良好。

【问题讨论】:

你在使用持久连接吗?你有什么样的用户使用(并发) 我没有使用 mysql_pconnect,目前我们有大约 200 个并发用户,我将 httpd-mpm 设置为 win_nt 为我们提供大约 350 个线程,目前如果我查看服务器状态apache 目前有大约 237 个请求和大约 100 个空闲的给予或接受,但它正在围绕这个波动。 我昨天确实注意到我们对 apache 的请求数量激增,从 150 猛增到 272 并且 apache 崩溃了,不幸的是我在此期间关闭了 access.log。我重新启用了它,以防它今天再次发生,所以如果再次发生,我可以捕捉到他们来自的 ip。我们在一个安全的 Intranet 网络上,没有人可以轻易地从外部访问它。 Apache服务器状态显示为目前:239个请求当前正被处理,111名空闲工人K_KKK__KCKKKKKK___KK_KK_KKKKKKKKCKKKKKK__KK_K_KK_K___K_KKCKKKKKK K__K_KKKKKKK_KK_K___KKK_K_KKCKKKKK_KK_K_K_KKKK_K_KKK_K____KKKKK_ KKK_KKK_KKKKKKWK_CK_K_KKK_KK__KKKKKKKKKKKK_C__K___KKK_K_K_KK_K_K K___KKCWKK__K_KKKKKK_KK__K__KK_CK_KKK_KKKW__KKKCKKKKCKKKK_KKKKKK KK_K_K__KK_K__K__KK__K_KK_K_K_K_K__KK_KK_KKK_KKKK___CK_KKK_KKKKC CKKKKKKKK_KK_KC_KKK ____ K_K_K_K ................... ……………………………………………………………………………………………………………………………… . 我很好奇这是否可能是我昨天用 keepalivetimeout 更改的设置的问题,我把它降低到 2,我已经把它放回 15 并重新启动了 apache,到目前为止没有问题但不确定这是否与此有关。 【参考方案1】:

你可以修改 windows REGISTRY 来解决这个问题,

首先在regedit中打开这个路径:

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

并创建 4 个新的 DWORD 作为此键和值:

TcpTimedWaitDelay
REG_DWORD: 0000001e (hex)

MaxUserPort
REG_DWORD: 0000fffe (hex)

TcpNumConnections
REG_DWORD: 00fffffe (hex)

TcpMaxDataRetransmissions
REG_DWORD: 00000005 (hex)

喜欢这个屏幕截图:

reference

【讨论】:

谢谢。顺便说一句,您引用的文章似乎声称这是一个 Window 10 问题。 Windows 10 于 2015 年发布,问题于 2012 年发布......但是,我在 2018 年遇到了这个问题,你的回答为我解决了这个问题,所以赞! @hemnathmouli 希望对你有所帮助【参考方案2】:

错误实际上不是来自 MySQL,而是来自from Windows itself:

当连接关闭时,在关闭连接的一侧,5 元组 Protocol, Local IP, Local Port, Remote IP, Remote Port 默认进入 TIME_WAIT 状态 240 秒。

在这种情况下,协议是固定的——TCP

本地 IP、远程 IP 和远程 PORT 通常也是固定的。所以变量是本地端口。

当您不绑定 1024-5000 范围内的端口时,会发生什么情况。 所以大致你有4000个端口。如果您在 4 分钟内使用所有这些 - 大致意思是您 每秒进行 16 次 Web 服务调用,持续 4 分钟,您将耗尽所有端口。这就是这个异常的原因。

换句话说,您已经用完了动态范围内的端口。那可能不应该发生。您在这里处理多少并发用户?

链接的博客有解决方法:

    通过注册表编辑增加动态端口范围。 通过注册表编辑减少系统希望连接在TIME_WAIT 中花费的时间。 运行一段代码,在没有 regedit 的情况下进行上述注册表编辑。

各种各样的解决方法!

另见this question on the Visual Studio forums,其中解释:

端口将被锁定一两分钟,以捕获可能在应用程序终止之前已发送但尚未到达的所有数据包。在 Winsock API 中,您可以设置套接字选项 SO_REUSEADDR 来解决此问题(也可以在 .NET Socket 类中设置此选项),但 TcpListener 级别太高,不允许您设置此选项。

很可能连接到 MySQL 的底层代码或在 Apache 中处理连接的代码没有尝试使用 SO_REUSEADDR

我敢打赌,您对 keepalive 超时的更改在这里会产生直接影响。尽管 理论上 减少它会释放套接字,但 Windows 不同意并保留套接字。

【讨论】:

dynamic port range changed starting with Windows Vista:起始端口:49152 结束端口:65535。您可以使用netsh int ipv4 show dynamicport tcp 命令查看当前设置。【参考方案3】:

这是Doldurma 的答案,但对于懒惰的人,您只需将其放在 .reg 文件中,然后单击它(在我的情况下不需要重新启动)

文件内容:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]

"TcpTimedWaitDelay"=dword:0000001e
"MaxUserPort"=dword:0000fffe
"TcpNumConnections"=dword:00fffffe
"TcpMaxDataRetransmissions"=dword:00000005

【讨论】:

工作就像一个魅力。发自内心的感谢。 这里也一样 :-) 谢谢。 谢谢!!!完美运行【参考方案4】:

在开发 Laravel 项目时发生在我身上。出于开发目的,这没什么大不了的,尤其是在您使用 Windows 系统时。但是对于生产,我只是在 Linux 上运行并解决了问题。 此外,如果可能,将 MySQL 连接从“localhost”更改为“127.0.0.1”。

【讨论】:

请注意,这个问题已在六年前提出,有几个答案提供信息,而您的回答没有为问题提供新的见解或解决方案。请不要挖掘旧问题,除非您有实际未发布的解决方案。【参考方案5】:

有一个简单的解决方法。

下载 CurrPorts http://www.nirsoft.net/utils/cports.html - 一个独立的免费软件工具,列出程序和服务正在使用哪些端口。当然,您可以使用 netstat、Windows 管理工具和任务管理器自己解决这个问题,但 CurrPorts 会为您完成这一切。

以管理员身份运行 Currports >> 选择通过运行到同一端口产生问题的服务/应用程序 >> 停止服务。停止服务 -

    直接来自 Currports 应用程序。 开始>>运行>>service.msc>>(从列表中选择)。 任务管理器。

希望你通过投票来激励我。

【讨论】:

【参考方案6】:

FWIW,我在类似的设置(Windows XP)上遇到了同样的问题。相同的代码在 Mac (OS X) 上没有这个问题。

我通过在 MySQLi 类中使用持久连接解决了这个问题。

更多信息请看这里:http://php.net/mysqli.persistconns

确保您了解与使用持久连接相关的所有问题/注意事项。

【讨论】:

这不是解决问题,而是解决问题。持久连接的行为非常不同,以至于它们需要您非常小心地编写应用程序。除非你熟悉它们或者你只在本地机器上打开它们,否则我不会推荐它。此解决方案可能会产生比它修复的问题更多的问题。

以上是关于MySQL/PHP 错误:[2002] 每个套接字地址(协议/网络地址/端口)通常只允许使用一次的主要内容,如果未能解决你的问题,请参考以下文章

无法启动 phpMyAdmin。不断收到 #2002 套接字错误

错误 2002 (HY000): 无法通过套接字 '/tmp/mysql.sock' 连接到本地 MySQL 服务器

错误 2002 (HY000): 无法通过套接字 '/tmp/mysql.sock' 连接到本地 MySQL 服务器

无法通过套接字 '/var/run/mysqld/mysqld.sock' (2) 连接到本地 MySQL 服务器(错误 2002)

phpmyadmin 2002 错误

MySQL 在负载测试后挂起。错误 2002 - 服务器没有响应(或本地 MySQL 服务器的套接字未正确配置)