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

时间:2012-04-25 14:37:48

标签: php mysql apache xampp

我无法在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,四核,4GB内存,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运行正常。

6 个答案:

答案 0 :(得分:8)

错误实际上并非来自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分钟,您将耗尽所有端口。这就是这个例外的原因。

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

链接的博客有解决方法:

  1. 通过注册表编辑增加动态端口范围。
  2. 通过注册表编辑减少系统希望在TIME_WAIT中花费连接的时间。
  3. 运行一些代码来执行上述注册表编辑而不使用regedit。
  4. 各种各样的解决方法!

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

      

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

    连接到MySQL的基础代码或处理Apache连接的代码很可能不会尝试使用SO_REUSEADDR

    我打赌你改变keepalive超时会对此产生直接影响。即使从理论上减少 释放套接字,Windows也不同意并保留套接字。

答案 1 :(得分:5)

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

喜欢此屏幕截图:

enter image description here

reference

答案 2 :(得分:2)

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

答案 3 :(得分:2)

这是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 :(得分:0)

有一个简单的解决方法。

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

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

  1. 直接来自Currports应用程序。
  2. 开始>>运行>> service.msc>> (从列表中选择)。
  3. 任务管理。
  4. 希望你通过民意调查来提升我。

答案 5 :(得分:-1)

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

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

有关详细信息,请参阅此处:http://php.net/mysqli.persistconns

确保您了解与使用持久连接相关的所有问题/警告。