我正在使用 PHP sockets extension (基本上是 socket(2)
相关 linux 系统调用的包装器)并希望在后续请求中重新使用我打开的套接字,同时为一个请求提供服务。性能是一个关键因素。
我打开的套接字都指向同一个 IP,这使得使用其他函数如 pfsockopen()
变得不可能(因为它每次都重复使用同一个套接字)并且我一次需要多个.
问题
如果我故意打开为一个请求服务的套接字,(我不调用 socket_close()
或 socket_shutdown()
)并将套接字与为下一个请求服务的相同 IP 的完全相同的参数; linux 会重新使用之前打开的套接字/文件描述符吗?
最后我想做的是避免在每次请求时都进行 TCP 握手。
附加信息:
我使用 apache worker MPM - 这意味着不同的请求可以但不一定由不同的进程提供服务。为简单起见,我们假设所有请求都来自同一进程。
我可以在 PHP 中获取打开和连接的套接字的文件描述符 ID。我可以打开并读取和写入
/dev/fd/{$id}
,但没有任何目的 - 它没有与远程服务器通信(也许这是一种幼稚的方法)。如果有人知道如何进行这项工作,我也会认为这是一个可以接受的答案。
最佳答案
如果你想在同一个进程中重用套接字,只需保持连接打开即可。这实际上是避免 TCP 握手的唯一选择。确保 keepalive 开启:
s.setsockopt( socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
如果您想生成新进程并将连接传递给它们,是的,它们将能够写入 /dev/fd/{$id}
并且这将通过网络发送数据.只需确保套接字在执行期间未关闭(了解 SOCK_CLOEXEC
)。
将套接字传递给不相关的进程是不可能的。您将不得不使用某种形式的进程间通信来实现这一点,而且我不确定 Intranet 或 Internet 条件下 TCP 握手的开销是否足以证明复杂性和与之相关的其他开销是合理的。
关于php - 是否可以重新使用故意打开的套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11107510/