ホームページ  >  記事  >  バックエンド開発  >  PHP の WebSocket を理解する

PHP の WebSocket を理解する

WBOY
WBOYオリジナル
2024-09-09 06:36:07699ブラウズ

Understanding WebSockets in PHP

WebSocket は、単一の TCP 接続上でリアルタイムの全二重通信チャネルを提供します。クライアントがサーバーにリクエストを送信して応答を待つ HTTP とは異なり、WebSocket を使用すると、複数のリクエストを必要とせずにクライアントとサーバー間の継続的な通信が可能になります。これは、チャット アプリケーション、ライブ通知、オンライン ゲームなど、リアルタイムの更新が必要なアプリケーションに最適です。

このガイドでは、WebSocket、WebSocket の仕組み、PHP での実装方法について説明します。


WebSocket とは何ですか?

WebSocket により、Web ブラウザ (またはその他のクライアント) とサーバー間の対話型通信が可能になります。 WebSocket の重要な側面は次のとおりです:

  1. 全二重通信: クライアントとサーバーの両方がいつでも相互にメッセージを送信できるため、従来の HTTP ポーリングよりも接続が効率的になります。
  2. 永続的な接続: WebSocket 接続は、一度確立されると、クライアントまたはサーバーによって明示的に閉じられるまで開いたままになります。
  3. 低遅延: WebSocket ではリクエストごとに新しい接続を開く必要がなくなるため、遅延が減少し、リアルタイム通信に最適です。

WebSocket の仕組み

  1. ハンドシェイク: 通信は HTTP リクエストから始まります。クライアントは、接続を HTTP から WebSocket に切り替えるために、Upgrade ヘッダーを含む HTTP リクエストを送信します。
  2. 接続の確立: サーバーがハンドシェイクを確認すると、接続が確立され、クライアントとサーバーの両方がメッセージの送受信を開始できるようになります。
  3. メッセージング: データはフレームを通じて送信されます。フレームは軽量で、HTTP ヘッダーのオーバーヘッドなしで送受信できます。
  4. 接続の終了: クライアントまたはサーバーのいずれかが接続を終了できます。

WebSocket を使用する場合

  • リアルタイム アプリケーション: チャット アプリケーション、ライブ通知、共同編集など。
  • ゲーム: 頻繁なアップデートが必要なマルチプレイヤー オンライン ゲーム用。
  • ライブ フィード: 株価、スポーツのスコア、または IoT デバイスからのリアルタイム データをストリーミングします。
  • コラボレーション ツール: 複数のユーザーがリアルタイムで更新を確認する必要がある Google ドキュメントなどのアプリ用。

PHP での WebSocket の実装

PHP で WebSocket を実装するには、WebSocket を使用したリアルタイムの双方向通信用に特別に設計された PHP ライブラリである Ratchet などのライブラリを使用できます。


Ratchet を使用した段階的な WebSocket 実装

ステップ 1: Composer 経由で Ratchet をインストールする

まず、Ratchet ライブラリをインストールする必要があります。 Composer がインストールされていると仮定すると、次のコマンドを実行できます:

composer require cboden/ratchet

ステップ 2: PHP で WebSocket サーバーを作成する

接続とメッセージを処理する単純な WebSocket サーバーを作成しましょう。

  1. WebSocketServer.php で WebSocket サーバー クラスを作成します:
<?php
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class WebSocketServer implements MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new \SplObjectStorage;
    }

    // Called when a new client connects
    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo "New connection: ({$conn->resourceId})\n";
    }

    // Called when a client sends a message
    public function onMessage(ConnectionInterface $from, $msg) {
        echo "New message: $msg\n";

        foreach ($this->clients as $client) {
            if ($from !== $client) {
                // Send the message to everyone except the sender
                $client->send($msg);
            }
        }
    }

    // Called when a connection is closed
    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
        echo "Connection closed: ({$conn->resourceId})\n";
    }

    // Called if an error occurs
    public function onError(ConnectionInterface $conn, \Exception $e) {
        echo "Error: {$e->getMessage()}\n";
        $conn->close();
    }
}

このクラスは、新しい接続、受信メッセージ、閉じられた接続、エラーを処理するメソッドを定義する Ratchet の MessageComponentInterface を実装します。

ステップ 3: WebSocket サーバーの実行

WebSocket サーバーを起動するための新しい PHP スクリプトを作成します (例: start_server.php)。

<?php
require __DIR__ . '/vendor/autoload.php';
use Ratchet\Http\HttpServer;
use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new WebSocketServer()
        )
    ),
    8080 // Port number for the WebSocket server
);

$server->run();

次のスクリプトを実行してサーバーを起動できます:

php start_server.php

サーバーは ws://localhost:8080 で実行されるようになります。

ステップ 4: WebSocket サーバーに接続するフロントエンドを作成する

次に、jQueryJavaScript を使用して HTML ファイルを作成し、WebSocket サーバーに接続しましょう。

  1. HTML ファイルを作成しますindex.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WebSocket Chat</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <h2>WebSocket Chat</h2>
    <input type="text" id="message" placeholder="Enter your message">
    <button id="send">Send</button>
    <div id="chat"></div>

    <script>
        $(document).ready(function() {
            var ws = new WebSocket('ws://localhost:8080');

            // When receiving a message from the server
            ws.onmessage = function(event) {
                $('#chat').append('<p>' + event.data + '</p>');
            };

            // Sending a message to the server
            $('#send').click(function() {
                var msg = $('#message').val();
                ws.send(msg);
                $('#message').val('');
            });
        });
    </script>
</body>
</html>

このシンプルなインターフェイスを使用すると、メッセージを入力して WebSocket サーバーに送信できます。接続されているすべてのクライアントがメッセージを受信して​​表示します。

ステップ 5: WebSocket 接続をテストする

  1. php start_server.php を実行して WebSocket サーバーを起動します。
  2. ブラウザでindex.htmlを開きます。
  3. 別のブラウザまたはタブで同じページを開いて、複数のクライアントをシミュレートします。

1 つのクライアントからメッセージを送信すると、接続されているすべてのクライアントのブラウザにメッセージが表示されます。


PHP에서 WebSocket을 사용할 때의 장점

  • 실시간 업데이트: WebSocket은 HTTP 폴링의 오버헤드 없이 실시간 업데이트를 제공합니다.
  • 낮은 지연 시간: 연결이 계속 열려 있으므로 메시지를 즉시 보낼 수 있어 지연 시간이 줄어듭니다.
  • 양방향 통신: 통신이 클라이언트에서 시작되는 기존 HTTP와 달리 서버와 클라이언트 모두 서로에게 동시에 메시지를 보낼 수 있습니다.

PHP의 WebSocket 사용 사례

  • 채팅 애플리케이션: WebSocket은 메시지를 모든 사용자에게 즉시 전송해야 하는 실시간 채팅 애플리케이션에 적합합니다.
  • 실시간 알림: 실시간 알림(예: 소셜 미디어, 주가)을 푸시해야 하는 앱에 적합합니다.
  • 실시간 공동 작업 도구: WebSocket을 사용하면 실시간 문서 편집과 같은 실시간 공동 작업이 가능합니다.
  • 온라인 게임: 멀티플레이어 온라인 게임은 WebSocket의 지연 시간이 짧은 통신의 이점을 누릴 수 있습니다.

결론

WebSocket은 클라이언트와 서버 간의 실시간 전이중 통신을 위한 강력한 솔루션을 제공하며 채팅 시스템, 실시간 알림 및 기타 실시간 애플리케이션에 이상적입니다. Ratchet과 같은 라이브러리와 함께 PHP를 사용하면 WebSocket 서버를 쉽게 설정하고 이를 애플리케이션에 통합하여 더 나은 사용자 참여와 응답성을 얻을 수 있습니다.

以上がPHP の WebSocket を理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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