php - 是否可以重新使用故意打开的套接字?

标签 php linux sockets tcp file-descriptor

我正在使用 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/

相关文章:

linux - 如何在 systemd 控制组之外启动进程

linux - 如何通过套接字将 `eof` 信号发送到在远程 shell 中运行的命令?

c - 用 C 读取客户端的所有行

c - 以不同方式处理信号

php - MySQL直接运行但CodeIgniter出现语法错误

按区域设置的 PHP 格式日期(分隔符,顺序不是文本)

linux - 有没有添加未列出字符的方法?

php - JavaScript 计数与 PHP 循环一致

php - 使用 PHP 连接到 Google Analytics API

python - 断开连接后在python中重新连接到PiCamera流