現在の位置: ホーム> 最新記事一覧> PHPでブロッキングサーバーを作成する:socket_createからsocket_set_blockまで

PHPでブロッキングサーバーを作成する:socket_createからsocket_set_blockまで

gitbox 2025-05-26

PHPにソケットベースのブロッキングサーバーを実装すると、基礎となるネットワーク通信の原則を理解するのに役立ちます。ブロッキングモードとは、データが読み取られるか、データが処理されるか、接続の準備が整うまでデータが読み取られるか、書き込まれるまで待機することを意味します。この記事では、ソケットの作成からブロッキングモードの設定まで、PHPのソケット拡張機能を使用する方法を段階的に分析し、単純なブロッキングサーバーを構築します。

1。準備:ソケット拡張機能が有効になっていることを確認します

まず、PHP環境でソケット拡張機能が有効になっていることを確認してください。 php.iniで次の行を見つけて解除します(もしあれば):

 extension=sockets

PHP -Mコマンドを使用して、拡張機能が有効になっているかどうかを確認します。

 php -m | grep sockets

ソケットを見ることができれば、拡張機能が有効になります。

2。ソケットを使用してTCPサーバーを作成します

以下は、ソケットを作成するための基本的な手順であり、各機能の役割を段階的に段階的に紹介します。

1.ソケットを作成します

$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 )を作成しています。

2.ソケットオプションを設定する(オプション)

ポート再利用など、一部のソケットオプションを設定できます。

 socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

3。バインドソケット

$host = '0.0.0.0';
$port = 9000;
if (!socket_bind($socket, $host, $port)) {
    die("socket_bind() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

4。ポートを聞いてください

if (!socket_listen($socket, 5)) {
    die("socket_listen() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

5保留中の接続要求の最大数を示します。

3.ブロッキングモードに設定します

socket_set_blockを使用して、ソケットをブロッキングモードに設定します。

 if (!socket_set_block($socket)) {
    die("socket_set_block() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

ブロッキングモードに設定すると、後続のsocket_acceptsocket_read 、およびその他の機能が操作が完了するまでブロックされます。

4.接続を受け入れ、データを読み取ります

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);
}

5。サーバーをシャットダウンします

終了する必要がある場合は、メインソケットを閉じることを忘れないでください。

 socket_close($socket);

6。アクセステスト

Telnet接続テストなどのコマンドラインクライアントを使用できます。

 telnet gitbox.net 9000

または、接続テスト用のシンプルなPHPクライアントを作成します。

要約します

socket_createからsocket_set_blockまで、完全なブロッキングサーバーを構築します。このモードは、教育、デバッグ、低コンカレンシーシナリオなどの単純なネットワーク通信アプリケーションに適しています。高い並行性シナリオの場合、非ブロッキングモードを使用するか、 Select / Pollを使用してより効率的なイベントループを実現することをお勧めします。

この記事の実用的な手順を通じて、PHPでブロッキングサーバーを構築するプロセス全体をマスターし、さらに詳細なネットワークプログラミングのための強固な基盤を築くことができます。