编程语言
首页 > 编程语言> > php – 是否有可能重新使用故意左开放套接字?

php – 是否有可能重新使用故意左开放套接字?

作者:互联网

我正在使用PHP sockets extension(基本上是套接字(2)相关的linux系统调用的包装器),并希望重新使用我在后续服务中提供一个请求时打开的套接字.性能是一个关键因素.

我打开的套接字都是相同的IP,这使得使用其他函数如pfsockopen()是不可能的(因为它每次都重用相同的单个套接字),我一次需要几个.

这个问题

如果我离开套接字我打开服务一个请求故意打开,(我不调用socket_close()或socket_shutdown())并将具有完全相同参数的套接字连接到服务于下一个请求的相同IP; linux会重新使用以前打开的socket / file-descriptor吗?

我最终想做的是避免每次请求都有TCP握手.

附加信息:

>我使用apache worker MPM – 这意味着不同的请求可以但不一定是来自不同的进程.为简单起见,我们假设所有请求都来自同一个进程.
>我可以在PHP中获取打开并连接的套接字的文件描述符ID.我可以打开并读取和写入/ dev / fd / {$id},但没有任何意义 – 它不与远程服务器通信(这可能是一种天真的方法).如果有人知道如何完成这项工作,我认为这也是一个可以接受的答案.

解决方法:

如果要在同一进程中重用套接字,只需将连接保持打开状态即可.这实际上是避免TCP握手的唯一选择.确保Keepalive已开启:

s.setsockopt( socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

如果您想生成新进程并将连接传递给它们,是的,它们将能够写入/ dev / fd / {$id},这将通过网络发送数据.只需确保在exec期间套接字没有关闭(了解SOCK_CLOEXEC).

将套接字传递给不相关的进程是不可能的.您将不得不使用某种形式的进程间通信来实现这一点,并且我不确定在Intranet或Internet条件下TCP握手的开销是否足以证明与此相关的复杂性和其他开销.

标签:php,linux,sockets,tcp,file-descriptor
来源: https://codeday.me/bug/20190902/1788000.html