9

我已经在 stackoverflow 上找不到解决方案,大多数其他相关主题都与 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

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

4

6 回答 6

20

你可以修改窗口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)

就像这个屏幕截图:

在此处输入图像描述

参考

于 2018-07-18T07:24:16.657 回答
10

该错误实际上不是来自 MySQL,而是来自 Windows 本身

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

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

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

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

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

链接的博客有解决方法:

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

各种各样的解决方法!

另请参阅Visual Studio 论坛上的这个问题,其中解释了:

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

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

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

于 2012-12-24T19:12:36.767 回答
5

这是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
于 2020-01-23T14:37:16.027 回答
2

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

于 2018-07-27T11:58:15.240 回答
0

有一个简单的解决方法。

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

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

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

希望你通过投票来鼓舞我。

于 2013-11-18T06:21:08.540 回答
-1

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

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

有关更多信息,请参见此处:http: //php.net/mysqli.persistconns

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

于 2013-07-23T12:44:39.130 回答