PHPにソケットベースのブロッキングサーバーを実装すると、基礎となるネットワーク通信の原則を理解するのに役立ちます。ブロッキングモードとは、データが読み取られるか、データが処理されるか、接続の準備が整うまでデータが読み取られるか、書き込まれるまで待機することを意味します。この記事では、ソケットの作成からブロッキングモードの設定まで、PHPのソケット拡張機能を使用する方法を段階的に分析し、単純なブロッキングサーバーを構築します。
まず、PHP環境でソケット拡張機能が有効になっていることを確認してください。 php.iniで次の行を見つけて解除します(もしあれば):
extension=sockets
PHP -Mコマンドを使用して、拡張機能が有効になっているかどうかを確認します。
php -m | grep sockets
ソケットを見ることができれば、拡張機能が有効になります。
以下は、ソケットを作成するための基本的な手順であり、各機能の役割を段階的に段階的に紹介します。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create() failed: " . socket_strerror(socket_last_error()) . "\n");
}
ここでは、IPv4( AF_INET )に基づいてTCPソケット( SOCK_STREAM )を作成しています。
ポート再利用など、一部のソケットオプションを設定できます。
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
$host = '0.0.0.0';
$port = 9000;
if (!socket_bind($socket, $host, $port)) {
die("socket_bind() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
if (!socket_listen($socket, 5)) {
die("socket_listen() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
5保留中の接続要求の最大数を示します。
socket_set_blockを使用して、ソケットをブロッキングモードに設定します。
if (!socket_set_block($socket)) {
die("socket_set_block() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
ブロッキングモードに設定すると、後続のsocket_accept 、 socket_read 、およびその他の機能が操作が完了するまでブロックされます。
echo "サーバーが開始されます,ポートを聞いてください $port...\n";
while (true) {
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
echo "socket_accept() failed: " . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
$input = socket_read($clientSocket, 1024);
if ($input === false) {
echo "socket_read() failed: " . socket_strerror(socket_last_error($clientSocket)) . "\n";
} else {
$input = trim($input);
echo "メッセージを受け取りました: $input\n";
$response = "あなたはそれを送った:$input\n";
socket_write($clientSocket, $response, strlen($response));
}
socket_close($clientSocket);
}
終了する必要がある場合は、メインソケットを閉じることを忘れないでください。
socket_close($socket);
Telnet接続テストなどのコマンドラインクライアントを使用できます。
telnet gitbox.net 9000
または、接続テスト用のシンプルなPHPクライアントを作成します。
socket_createからsocket_set_blockまで、完全なブロッキングサーバーを構築します。このモードは、教育、デバッグ、低コンカレンシーシナリオなどの単純なネットワーク通信アプリケーションに適しています。高い並行性シナリオの場合、非ブロッキングモードを使用するか、 Select / Pollを使用してより効率的なイベントループを実現することをお勧めします。
この記事の実用的な手順を通じて、PHPでブロッキングサーバーを構築するプロセス全体をマスターし、さらに詳細なネットワークプログラミングのための強固な基盤を築くことができます。