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

MySQL/PHP错误:[2002]每个套接字地址(协议/网络地址/端口)通常只允许使用一次,php,mysql,apache,xampp,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

我无法在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高清、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对我来说运行良好。

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

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

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

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

如果不绑定1024-5000范围内的端口,则会发生这种情况。 因此,大约有4000个端口。如果你在4分钟内使用了所有这些功能,也就是说大致上是你自己 每秒进行16次web服务调用,持续4分钟,您将耗尽所有端口。这就是这个例外的原因

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

链接博客有以下变通方法:

  • 通过注册表编辑增加动态端口范围
  • 通过注册表编辑,减少系统希望连接花费在
    time\u WAIT
    中的时间
  • 运行一段代码,在不使用regedit的情况下执行上述注册表编辑
  • 各种各样的变通方法

    另请参见,其中解释了:

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

    连接MySQL的底层代码或Apache中处理连接的代码很可能没有尝试使用
    SO\u REUSEADDR


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

    FWIW,我在类似的设置(Windows XP)中也遇到了同样的问题。在Mac(OS X)上,同样的代码在没有这个问题的情况下工作

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

    有关更多信息,请参见此处:


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

    有一个简单的解决方法

    下载CurrPorts-一个独立的免费软件工具,列出使用哪些端口的was程序和服务。当然,您可以使用netstat、Windows管理工具和任务管理器自己解决这个问题,但是CurrPorts可以帮您解决所有问题

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

  • 直接从Currports应用程序
  • 启动>>运行>>服务.msc>>(从列表中选择)
  • 任务经理

  • 希望你能通过轮询来激励我。

    你可以修改windows
    注册表来解决这个问题

    首先在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)
    
    与此屏幕截图类似:


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

    这是答案,但对于懒惰的人,您只需将其放在.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
    

    您正在使用持久连接吗?你有什么样的用户使用(并发)我没有使用mysql\u pconnect,目前我们有大约200个并发用户,我的httpd mpm设置为win\u nt,可以提供大约350个线程,如果我查看服务器状态,apache目前大约有237个请求,大约有100个空闲的给予或接受请求,但目前它正在围绕这一点波动。我昨天确实注意到,我们对apache的请求数量大幅增加,从150个疯狂地增加到272个,apache崩溃,不幸的是,在此期间我已注销access.log。我重新启用了它,以防今天再次发生,这样如果再次发生,我可以捕获他们来自的ip。我们在一个安全的intranet网络上,没有人可以轻易地从外部访问它。Apache服务器状态显示为当前:239个请求当前正在处理,(KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKCKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK