2012-06-18 65 views
3

在使用worker MPM的apache服務器上,是否有可能打開多個持久套接字到同一個TCP地址?打開多個持久套接字到同一個域?

當我做到以下幾點:

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

我得到兩個獨立的套接字資源,又具有相同的底層連接(我可以告訴大家,因爲如果我寫$SocketA我可以閱讀$SocketB和副遠程響應反之亦然)。我想有兩個獨立的持久連接。

這可能嗎?

回答

2

這是可能的,但您需要爲第二個持久連接使用不同的主機名/ IP地址。

原因是,如果要連接的主機完全相同(主機和端口),它將返回現有的持久連接(如果存在),而不是創建新連接。

PHP跟蹤持久連接基於主機和端口(source)在內部建立一個哈希值:

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

因此,如果您使用相同的主機和端口$socketB你要找回現有從$socketA連接。 PHP會將此散列值與連接一起存儲,因此下次您撥打pfsockopen時,它會重新生成散列並查找它,如果發現它,則返回舊連接。

在套接字B上,您可以嘗試直接連接到IP地址,或者將別名替換爲第一個,以便最終獲得2個連接到相同位置,但是欺騙PHP創建2個連接。這些都是變通辦法,但不是完全可移植的。

大部分答案是肯定和否,你不能使用相同的主機和端口來獲得2個連接,但你可以使用一種可能會引起混淆或導致未解決的問題的技巧來解決它。

+0

感謝您的回答。我試了一下,'host'是IP地址(不是域名)。不同的端口可以做到這一點。 – thwd

相關問題