在同一个域名下打开多个持久化套接字是否可行?

3
在使用worker MPM的Apache服务器上,是否可以打开多个持久连接到同一TCP地址?
当我执行以下操作时:
$SocketA = pfsockopen('tcp://domain.com', 80);
$SocketB = pfsockopen('tcp://domain.com', 80);

我获得了两个独立的套接字资源,但却具有相同的底层连接(我可以确定这一点,因为如果我向$SocketA写入内容,我可以从$SocketB读取远程响应,反之亦然)。我希望拥有两个单独的持久化连接。是否可以实现?
1个回答

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

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

PHP通过基于主机和端口内部创建哈希值来跟踪持久连接(source):”
spprintf(&hashkey, 0, "pfsockopen__%s:%ld", host, port);

因此,如果您对$socketB使用相同的主机和端口,则将从$socketA获取现有连接。PHP将此哈希值与连接一起存储,因此下次调用pfsockopen时,它会重新生成哈希值,然后查找它,如果找到它,则返回旧连接。
在套接字B上,您可以尝试直接连接到IP地址,或者将某个其他主机名别名为第一个主机名,以便最终获得到同一位置的2个连接,但是这些都是解决方法,不太容易移植。
总的来说,答案是肯定的和否定的,您不能使用相同的主机和端口获取2个连接,但是您可以使用技巧进行解决,但可能会导致混淆或引起未预见的问题。

谢谢你的回答。我试了一下,host是IP地址(而不是域名)。使用不同的端口可以解决问题。 - thwd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接