gpt4 book ai didi

php - 打开多个持久套接字到同一个域?

转载 作者:搜寻专家 更新时间:2023-10-31 21:14:54 25 4
gpt4 key购买 nike

在使用 worker MPM 的 apache 服务器上,是否有可能以某种方式打开多个持久套接字到同一个 TCP 地址?

当我执行以下操作时:

$SocketA = pfsockopen('tcp://domain.com', 80);
$SocketB = pfsockopen('tcp://domain.com', 80);

我得到两个独立的套接字资源,但具有相同的底层连接(我可以判断是因为如果我写入 $SocketA 我可以从 $SocketB 读取远程响应反之亦然)。我想要两个独立的持久连接。

这可能吗?

最佳答案

这是可能的,但您需要为第二个持久连接使用不同的主机名/IP 地址。

原因是,如果您要连接的主机完全相同(主机和端口),它将返回现有的持久连接(如果存在),而不是创建一个新连接。

PHP 通过基于主机和端口 (source) 在内部创建哈希值来跟踪持久连接:

spprintf(&hashkey, 0, "pfsockopen__%s:%ld", host, port);

因此,如果您为 $socketB 使用相同的主机和端口,您将从 $socketA 取回现有连接。 PHP 将此散列值与连接一起存储,因此下次您调用 pfsockopen 时,它会重新生成散列值,然后查找它,如果找到它,则返回旧连接。

在套接字 B 上,您可以尝试直接连接到 IP 地址,或者将其他一些主机名作为第一个主机名的别名,以便最终获得到同一位置的 2 个连接,但您欺骗 PHP 创建了 2 个连接。不过,这些都是解决方法,并不完全可移植。

在大多数情况下,答案是肯定的和否定的,你不能使用相同的主机和端口来获得 2 个连接,但你可以使用一个可能会造成混淆或导致无法预料的问题的技巧来解决它。

关于php - 打开多个持久套接字到同一个域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11086678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com