ホームページ  >  記事  >  バックエンド開発  >  PHP と Swoole を使用したリアルタイム通信の実装に関する完全なチュートリアル

PHP と Swoole を使用したリアルタイム通信の実装に関する完全なチュートリアル

WBOY
WBOYオリジナル
2023-06-28 08:12:061092ブラウズ

インターネットとモバイル通信技術の急速な発展に伴い、リアルタイム通信がますます注目を集めています。リアルタイム通信は、ユーザー間のインスタント メッセージング、オンライン音声通話やビデオ通話、ゲーム対戦などの機能を実現し、インターネット アプリケーションにさらなる可能性をもたらします。

この記事では、PHP と Swoole を使ってリアルタイム通信を実現する方法を紹介し、簡単な WebSocket アプリケーションから始めて、Socket プログラミングの基礎知識と Swoole の応用実践を段階的に紹介します。この記事を読むには、PHP の基礎とネットワーク プログラミングに関する基本的な知識が必要です。

1. WebSocket の基本

WebSocket は、HTTP プロトコルをベースとした双方向通信プロトコルであり、「ハンドシェイク」と呼ばれるプロトコルを使用して双方向通信を実現します。 WebSocket 接続の利点は、オーバーヘッドが非常に小さく、リアルタイム通信が非常に優れており、クライアントとサーバーの間で双方向のリアルタイム通信を確立できることです。

WebSocket の確立には、次の手順が必要です:

1. ブラウザは、サーバーへの WebSocket ハンドシェイク要求を開始します。要求ヘッダーには、アップグレード、接続、秒などのいくつかのキー フィールドが含まれています。 WebSocket - キーなど

2. サーバーはクライアントの WebSocket リクエストを処理し、仕様を満たしている場合は、応答ヘッダーに Upgrade、Connection、Sec-WebSocket-Accept などのフィールドを含む応答メッセージを返します。

3. クライアントはサーバーから応答メッセージを受信し、Sec-WebSocket-Accept フィールドをチェックして、WebSocket ハンドシェイクが正常に確立されたことを確認します。

4. 双方ともデータ通信を開始でき、テキスト、バイナリ、ピン、ポンなどのメッセージを送信できます。

PHP で WebSocket を使用すると、Swoole が提供する WebSocket サービスを通じて実装できます。 Swooleの基本的な使い方を紹介します。

2. Swoole の基本

1. Swoole のインストール

Swoole の使用を開始する前に、サーバーに Swoole 拡張機能をインストールする必要があります。次のコマンドを使用してインストールできます:

pecl install swoole

またはソース コードからインストールできます:

$ wget https://github.com/swoole/ swoole-src/archive /v4.3.3.tar.gz
$ tar zxvf v4.3.3.tar.gz
$ cd swoole-src-4.3.3
$ phpize
$ ./configure
$ make && make install --with-swoole

  1. Swoole WebSocket サービス

クライアントが確立したときにポート 9501 をリッスンする単純な WebSocket サービスを実装しましょう。サーバーとの接続時に、クライアントに hello メッセージを送信します。

<?php

$server = new SwooleWebSocketServer("0.0.0.0", 9501);

$server->on('open', function (SwooleWebSocketServer $server, $request) {
    echo "new client connected
";
    $server->push($request->fd, "hello");
});

$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    echo "received message: {$frame->data}
";
});

$server->start();

このコードでは、新しい WebSocket サーバーを作成し、ポート 9501 でリッスンします。クライアントがサーバーとの接続を確立すると、open イベントがトリガーされ、Hello メッセージがクライアントに送信されます。クライアントがサーバーにメッセージを送信すると、メッセージ イベントがトリガーされ、クライアントから送信された情報をエコーを通じて出力できます。

上記のコードを開始した後、ブラウザまたは WebSocket クライアントを使用してサーバーに接続できます:

let ws = new WebSocket('ws://127.0.0.1:9501');
ws.onopen = function(event) {
    console.log('WebSocket connected');
};
ws.onmessage = function(event) {
    console.log('Received:', event.data);
};
ws.send('Hello, Server');

クライアントが正常に接続すると、コンソールに次の情報が出力されます:

WebSocket connected
Received: hello

クライアントがサーバーから送信された hello メッセージを正常に受信したことを示します。

3. リアルタイム チャット アプリケーションを実装する

次に、複数のユーザーがチャット ルームでリアルタイムにコミュニケーションできるようにするリアルタイム チャット アプリケーションを実装しましょう。このため、チャット ルームの基本機能を実装するには、上記の WebSocket サーバーを拡張し続ける必要があります。

<?php

$server = new SwooleWebSocketServer("0.0.0.0", 9501);

$server->set([
    'worker_num' => 2,    //启动2个Worker进程
]);

$server->on('open', function (SwooleWebSocketServer $server, $request) {
    echo "new client connected
";
    foreach($server->connections as $fd) {
        $server->push($fd, "{$request->fd} joined the room");
    }
});

$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    foreach($server->connections as $fd) {
        if ($fd != $frame->fd) {
            $server->push($fd, "user {$frame->fd}: {$frame->data}");
        }
    }
});

$server->on('close', function ($server, $fd) {
    echo "client {$fd} closed
";
    foreach($server->connections as $fds) {
        $server->push($fds, "{$fd} quited the room");
    }
});

$server->start();

上記のコードでは、open イベントと close イベントの処理を追加しました。ユーザーが接続するか接続を閉じると、チャット ルームに参加するかチャット ルームから退出するためのメッセージが接続されている他のユーザーに送信されます。ユーザーがチャット ルームでメッセージを送信すると、そのメッセージは他のオンライン ユーザーにブロードキャストされます。

上記のコードを開始した後、複数のブラウザ ウィンドウを使用してサーバーに個別に接続し、同じチャット ルームに入ることができます。ユーザーがメッセージを送信すると、他のユーザーはリアルタイムでメッセージを受信できます。

この記事では、PHP と Swoole を使用して、基本的な WebSocket アプリケーションからリアルタイム チャット ルーム アプリケーションまで、リアルタイム コミュニケーションを実現する方法を紹介します。 Swoole は、より柔軟な非同期プログラミング手法を提供し、高性能、高同時実行性、低遅延のアプリケーションを簡単に作成できるようにします。

以上がPHP と Swoole を使用したリアルタイム通信の実装に関する完全なチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。