PHPを使用して、基礎となるソケット通信を含むアプリケーションを開発する場合、一部の高度な関数は、 socket_wsaprotocol_info_importやsocket_getpeernameなどの主流のドキュメントで詳細に言及することはほとんどありません。多くの場合、マルチプロセスまたはクロスプロセスの通過ソケットのコンテキストで役立ちます。この記事では、実際のケースを組み合わせて、これらの2つの機能がどのように連携するかを説明し、実行可能なPHPの例を示します。
socket_wsaprotocol_info_importは、phpがWindowsプラットフォームにソケットプロトコル情報をインポートするために使用する関数です。その機能は、通常、他のプロセスから受信したソケットに使用されるソケットプロトコル情報を含む構造化されたデータからソケットインスタンスを再構築することです。
Socket_GetPeerNameは、リモート接続ピアのIPアドレスとポートを取得するために使用されます。この関数は、許可確認をデバッグ、ロギング、または実行する場合に非常に役立ちます。
マルチプロセスアーキテクチャでは、プロセスがクライアント接続を受け入れますが、この接続を処理のために別の子プロセスに渡したいと考えているため、これにはソケットの「クロスプロセス配信」が含まれます。 Windowsは、この機能をサポートするためのWSADUPLICATESSOCKESTメカニズムを提供します。 PHPでの対応するインポート操作は、 socket_wsaprotocol_info_importです。
子プロセスがこのソケット情報構造を受信し、 Socket_WSAProtocol_Info_importを介して利用可能なソケットを構築すると、接続のソースをさらに確認する必要がある場合があります。この時点で、 socket_getPeernameを使用して、相手のIPおよびポートを取得できます。
以下は、Windowsプラットフォーム上のシミュレートされたシナリオであり、1つのプロセスがソケットをエクスポートし、もう1つのプロセスでインポートした後にクライアントIP情報を取得します。
<?php
// この構造は別のプロセスから来ていると仮定します WSADuplicateSocket 動作します
$raw_info = file_get_contents('http://gitbox.net/socket_info.bin');
// シリアル化 socket に情報を転送します PHP socket
$info = unserialize($raw_info);
$socket = socket_wsaprotocol_info_import($info);
if ($socket === false) {
die("socket_wsaprotocol_info_import 失敗: " . socket_strerror(socket_last_error()));
}
// クライアントのアドレスとポートを取得します
if (socket_getpeername($socket, $peer_ip, $peer_port)) {
echo "クライアント IP: $peer_ip\n";
echo "クライアント端口: $peer_port\n";
} else {
echo "无法获取クライアント信息: " . socket_strerror(socket_last_error($socket)) . "\n";
}
// ここでさらに処理できます socket 接続する,たとえば、データの読み取りや応答の作成
注:例の簡潔さのために、ソケット情報の送信はhttp://gitbox.net/socket_info.binを介してここでシミュレートされます。このタイプのデータインタラクションは、より安全なIPC、共有メモリ、または名前付きパイプを使用して、実際のアプリケーションで実現できます。
マルチプロセスサーバーの設計:主なプロセスは、ポートを聴き、接続を受信し、ソケットを子プロセスに発送する責任があります。
許可分離処理:子プロセスは、異なる許可環境で実行され、クライアントIPに従って異なる処理戦略を実行します。
ロードバランシングスキーム:ソケットを子どものプロセスに割り当てたり、リソースの使用率を低くしたりします。
socket_wsaprotocol_info_importは高度な機能機能です。毎日のPHP開発では一般的には使用されていませんが、 socket_getPeernameとの組み合わせにより、複雑なWindowsマルチプロセスネットワークアプリケーションのシステムの柔軟性と保守性が大幅に向上できます。この記事の実際のケースが、基礎となるネットワークサービスを構築する際の迂回を避けるのに役立つことを願っています。