3

ワーカー MPM を使用する Apache サーバーで、同じ TCP アドレスに対して複数の永続的なソケットを開くことは何とか可能ですか?

私が次のことをするとき:

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

2 つの独立したソケット リソースを取得しますが、基になる接続は同じです (書き込むと$SocketAリモート レスポンスを読み取ることができ$SocketB、その逆も可能であるため、わかります)。2 つの個別の永続的な接続を使用したいと考えています。

これは可能ですか?

4

1 に答える 1

2

可能ですが、2 番目の永続的な接続には別のホスト名/IP アドレスを使用する必要があります。

理由は、接続先のホストがまったく同じ (ホストとポート) である場合、新しい接続を作成するのではなく、存在する場合は既存の永続的な接続を返すためです。

PHP は、ホストとポート ( source )に基づいてハッシュ値を内部的に作成することにより、永続的な接続を追跡します。

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

したがって、 に同じホストとポートを使用すると、$socketBから既存の接続を取り戻すことになります$socketA。PHP はこのハッシュ値を接続とともに保存するため、次に を呼び出すとpfsockopen、ハッシュが再生成されて検索され、見つかった場合は古い接続が返されます。

ソケット B では、IP アドレスに直接接続するか、他のホスト名を最初のホスト名にエイリアスして、最終的に同じ場所への 2 つの接続を取得することができますが、PHP をだまして 2 つの接続を作成させます。ただし、これらは両方とも回避策であり、完全に移植可能ではありません。

ほとんどの場合、答えは「はい」と「いいえ」です。同じホストとポートを使用して 2 つの接続を取得することはできませんが、混乱したり予期しない問題を引き起こしたりする可能性のあるトリックを使用して回避できます。

于 2012-06-18T16:19:50.880 に答える