我无法在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运行正常。
发布于 2018-08-30 15:19:28
该错误实际上并非来自MySQL,而是来自Windows本身:
当连接关闭时,在关闭连接的一侧,5元组{协议,本地IP,本地端口,远程IP,远程端口}默认进入TIME_WAIT状态240秒。 在这种情况下,协议是固定的 - TCP 本地IP,远程IP和远程PORT通常也是固定的。所以变量是本地端口。 当你没有绑定1024-5000范围内的端口时会发生什么。所以粗略地说你有4000个端口。如果你在4分钟内全部使用它们 - 意味着大约每4秒钟进行16次网络服务呼叫,你将耗尽所有端口。这就是这个例外的原因。
换句话说,您已经耗尽了动态范围内的端口。这可能不应该发生。你在这里处理多少并发用户?
链接的博客有解决方法:
TIME_WAIT
通过注册表编辑减少系统希望连接所花费的时间。有多种解决方法!
另请参阅Visual Studio论坛上的这个问题,其解释如下:
端口将被锁定一两分钟以捕获在应用程序终止之前可能已发送但尚未到达的所有数据包。在Winsock API中,您可以设置套接字选项SO_REUSEADDR来解决此问题(此选项也可以在.NET Socket类中设置),但TcpListener太高级别,并且不允许您设置此选项。
连接到MySQL的基础代码或处理Apache连接的代码很可能不会尝试使用SO_REUSEADDR
。
我打赌你改变keepalive超时会对此产生直接影响。尽管理论上减少它可以释放套接字,但Windows不同意并保留套接字。
发布于 2018-08-30 16:33:37
有一个简单的解决方法。
下载CurrPorts http://www.nirsoft.net/utils/cports.html - 一个独立的免费软件工具,列出程序和服务正在使用哪些端口。当然,您可以使用netstat,Windows管理工具和任务管理器自行解决这个问题,但CurrPorts会为您完成这一切。
以管理员身份运行Currports >>通过运行到同一端口选择创建问题的服务/应用程序>>停止服务。停止服务 -
希望你通过民意调查来提升我。
https://stackoverflow.com/questions/-100002506
复制相似问题