file_get_contents无法打开流:由于系统缺少足够的缓冲区空间,无法对套接字执行操作


file_get_contents failed to open stream: An operation on a socket could not be performed because the system lacked sufficient buffer space

我正在运行带有WAMP(Apache 2.2.8,php 5.2.6)的Windows 2008服务器,并且出现此错误...

PHP 警告:file_get_contents(http://www.example.com/portal/) [function.file-get-content]:无法打开流:由于系统缺少足够的缓冲区空间或队列已满,无法对套接字执行操作。

有没有人经历过类似的事情?

谢谢!

此错误消息与Winsock错误WSAENOBUFS相关联,实际上来自Windows而不是直接来自SQL Server,有两个众所周知的根本原因。然而,它今天仍然难倒人们,可能是因为没有单一的来源可以解释根本原因并为两者提供解决方案。以下是您可能会看到此错误的两种常见情况的说明以及每种情况的快速解决方案:操作系统的 TCP 缓冲区内存不足

当功能强大的客户端计算机(尤其是具有大量 RAM 的客户端计算机)运行 x86 版本的 Windows 时,人们使用 c:''boot.ini 文件中的/PAE 开关来允许该计算机上的应用程序能够寻址整个内存范围。另一个通常用于为应用程序提供更多内存的开关是 boot.ini 文件中的/3gb开关。当这两者结合在一起时,问题就来了:/3gb开关通过减少操作系统可用的内存量为应用程序提供更多内存。当它在应用程序需要许多操作系统资源(例如打开许多 TCP 连接)的强大计算机上使用时,这可能会导致操作系统耗尽 TCP 缓冲区等资源的内存。发生这种情况时,Winsock 会抛出错误WSAENOBUFS

解决方案:从C:'boot.ini上卸下/3gb开关。在这种情况下,根本问题是操作系统上的内存压力,因此卸下/3gb开关将为操作系统提供更多内存,并将缓解此问题。操作系统用完可用的 TCP"临时"端口

当客户端计算机打开许多 TCP 连接并运行 Windows Server 2003、Windows XP 或任何早期版本的 Windows 时,它可能会用完 TCP"临时"端口。在 Windows Server 2003、Windows XP 和更早版本中,Windows 将计算机上可用的临时端口数限制为大约 5000 个。对于不使用连接池的应用程序,遇到此问题尤其常见。

解决方案:若要使更多临时端口可用,请按照此知识库中的说明进行操作,其中描述了如何创建MaxUserPort注册表项:http://support.microsoft.com/kb/196271