【发布时间】:2012-06-21 21:05:09
【问题描述】:
我正在使用PHP sockets extension(基本上是与socket(2) 相关的linux 系统调用的包装器),并且希望在为后续请求提供服务时重新使用我打开的套接字。性能是一个关键因素。
我打开的套接字都指向同一个 IP,这使得无法使用像 pfsockopen() 这样的其他功能(因为它每次都重用同一个套接字),我一次需要几个。
问题
如果我让我打开的套接字故意打开服务一个请求(我不调用socket_close() 或socket_shutdown())并将具有完全相同参数的套接字连接到为下一个请求提供服务的相同IP; linux会重用之前打开的socket/文件描述符吗?
我最终要做的是避免每次请求都进行 TCP 握手。
其他信息:
我使用 apache worker MPM - 这意味着不同的请求可以是,但不一定由不同的进程提供服务。为简单起见,我们假设所有请求都来自同一个进程。
我可以在 PHP 中获取打开和连接的套接字的文件描述符 ID。我可以打开并读写
/dev/fd/{$id},但没有任何目的-它没有与远程服务器通信(也许这是一种天真的方法)。如果有人知道如何完成这项工作,我也会认为这也是一个可以接受的答案。
【问题讨论】:
-
只是我对它的低级系统方面了解的很少,我相信 Linux 系统每次都会尝试使用不同的文件描述符,而不是回收旧的文件描述符。例如在您的情况下,它很可能会为您使用的每个套接字分配一个新的文件描述符。此外,如果您不关闭它们,您可能会用完可用的文件描述符。但我想你已经知道了。
-
内核将为进程重用以前关闭的文件描述符,但不会打开套接字。你有办法保持从一个 HTTP 请求到下一个 HTTP 请求的状态吗?
-
感谢您的 cmets。 @NikolaiNFetissov:是的,我这样做了,但是 PHP 没有公开原始文件描述符,而且我无法真正将 PHP 套接字资源保存在任何地方(我假设它们不可序列化)。
标签: php linux sockets tcp file-descriptor