【问题标题】:Open mutliple persistent sockets to same domain?打开多个持久套接字到同一个域?
【发布时间】:2012-06-20 15:34:26
【问题描述】:

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

当我执行以下操作时:

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

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

这可能吗?

【问题讨论】:

    标签: php sockets persistent-connection


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。我试了一下,host 是 IP 地址(不是域名)。不同的端口可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多