ホームページ  >  記事  >  バックエンド開発  >  PHP と WebSocket を使用してインスタント メッセージング機能を実装する方法

PHP と WebSocket を使用してインスタント メッセージング機能を実装する方法

王林
王林オリジナル
2023-06-27 13:06:092010ブラウズ

今日のインターネットの急速な発展の時代では、インスタント メッセージングの需要が高まっています。ユーザーのニーズに応え、ユーザー エクスペリエンスを向上させるために、多くの Web サイトにはインスタント メッセージング機能が統合されています。では、PHP と WebSocket を使用してインスタント メッセージング機能を実装するにはどうすればよいでしょうか?この記事では、PHP と WebSocket を使用してインスタント メッセージング機能を実装する手順を詳しく紹介します。

1. WebSocket プロトコルを理解する

WebSocket は、TCP プロトコルに基づいた新しいネットワーク通信プロトコルであり、クライアントとサーバー間の双方向通信 (インスタント メッセージングなど) を実現できます。チャット ルーム。シナリオで使用します。従来の HTTP プロトコルでは、クライアントはサーバーにリクエストを送信してデータを取得する必要がありますが、WebSocket ではクライアントとサーバーの間に永続的な接続が確立され、いつでもデータを相互に送信できます。

WebSocket を使用してインスタント メッセージング機能を実装する前に、WebSocket プロトコルとその利点と欠点を理解する必要があります。 WebSocket プロトコルの利点は次のとおりです:

1. 永続的な接続を通じて、双方向通信を迅速に実現し、帯域幅の消費を削減できます。

2. HTTP リクエストを減らすことで、サーバーのパフォーマンスを向上させることができます。

3. 互換性テストはさまざまなブラウザーで実行でき、複数のブラウザーをサポートします。

4. さまざまなプログラミング言語を通じて実装できます。

しかし同時に、WebSocket プロトコルにはいくつかの欠点もあります:

1. WebSocket プロトコルは、すべての主流ブラウザーでまだサポートされていません。たとえば、IE の以前のバージョンを搭載したブラウザーは、 WebSocket プロトコル。

2. WebSocket 接続に障害が発生した場合、サーバーとクライアントの両方が再接続する必要があります。

3. データ漏洩やその他の問題を防ぐために、セキュリティとプライバシーを確​​保する必要があります。

4. システムの負荷が増加する可能性があります。

2. PHP で WebSocket を実装する方法

1. Ratchet ライブラリを使用します

Ratchet は、PHP が WebSocket プロトコルを実装するためのライブラリであり、HTTP リクエスト処理、WebSocket サーバーを提供します。およびクライアントツール。 Ratchet は、Symfony や Laravel フレームワークなど、さまざまな環境で使用できます。 Ratchet を使用する利点は、開発の難しさと基礎となる詳細の作業負荷を軽減しながら、WebSocket 機能を迅速に実装できることです。

Ratchet を使用して WebSocket を実装する手順は次のとおりです。

(1) Ratchet ライブラリをインストールします

Ratchet ライブラリを使用する前に、Composer ツールをインストールする必要がありますあなたのコンピュータの中で。 Composer をインストールした後、コマンド ライン ツールを使用して Ratchet ライブラリをインストールします。

composer require cboden/ratchet

(2) WebSocket サーバーの作成

Ratchet ライブラリをインストールした後、WebSocket サーバーを作成する必要があります。以下は、単純な Hello World アプリケーションです。

<?php
use RatchetServerIoServer;
use RatchetHttpHttpServer;
use RatchetWebSocketWsServer;
use MyAppWebSocketApplication;

require __DIR__ . '/vendor/autoload.php';

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new WebSocketApplication()
        )
    ),
    8080
);

$server->run();

上記のコードでは、WebSocketApplication は、自分で記述する必要がある WebSocket アプリケーション クラスです。 WebSocket アプリケーション クラスを作成するには、MessageComponentInterface インターフェイスを実装する必要があります。最も重要なメソッドは、クライアント メッセージの受信時に呼び出される onMessage() です。

<?php
namespace MyApp;
use RatchetMessageComponentInterface;
use RatchetConnectionInterface;

class WebSocketApplication implements MessageComponentInterface
{
    protected $clients;

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

    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo "New connection! ({$conn->resourceId})
";
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        foreach ($this->clients as $client) {
            if ($from !== $client) {
                $client->send($msg);
            }
        }
    }

    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
        echo "Connection {$conn->resourceId} has disconnected
";
    }

    public function onError(ConnectionInterface $conn, Exception $e) {
        echo "An error has occurred: {$e->getMessage()}
";
        $conn->close();
    }
}

(3) WebSocket サーバーをテストする

上記の手順を完了したら、ブラウザで WebSocket クライアントを使用してテストするか、コマンド ラインで WebSocket クライアントを使用してテストすることができます。テスト 。

2. Swoole 拡張機能を使用する

PHP で WebSocket プロトコルを実装するもう 1 つの方法は、Swoole 拡張機能を使用することです。 Swoole は、WebSocket 機能を迅速に実装できる高性能ネットワーク通信フレームワークであり、Coroutine、非同期 MySQL などのパフォーマンスを向上させる機能も提供します。

Swoole 拡張機能を使用して WebSocket を実装する手順は次のとおりです:

(1) Swoole 拡張機能をインストールします

まず、Swoole 拡張機能をコンピュータにインストールする必要があります。 。 Swoole 拡張機能をインストールした後、Swoole ライブラリを PHP スクリプトに導入します。

require "vendor/autoload.php";

(2) WebSocket サーバーを作成します

Swoole を使用して WebSocket を実装するためのコア コードは次のとおりです。

$server = new SwooleWebSocketServer("127.0.0.1", 8080);

$server->on('open', function (SwooleWebSocketServer $server, $request) {
    echo "server: handshake success with fd{$request->fd}
";
});

$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}
";
    $server->push($frame->fd, "this is server :" . date("Y-m-d H:i:s"));
});

$server->on('close', function ($ser, $fd) {
    echo "client {$fd} closed
";
});

$server->start();

上記のコードでは、on メソッドを使用して、open、message、close などのイベントを登録しています。クライアントが WebSocket サーバーに接続すると、サーバーは open イベントをコールバックし、クライアントがメッセージを送信すると、サーバーはメッセージ イベントをコールバックして、クライアントから送信されたメッセージを処理します。最後に、クライアントが WebSocket 接続を閉じると、サーバーは close イベントをコールバックします。

3. WebSocket 通信ツール クラスのカプセル化

コードの再利用性を向上させるために、WebSocket 通信関数をツール クラスにカプセル化して、他のコードからツール クラスのメソッドを簡単に呼び出すことができます。 WebSocket通信を実装します。

以下は、単純な WebSocket ツール クラスです:

<?php
namespace MyApp;

use RatchetClientWebSocket;
use RatchetRFC6455MessagingFrame;
use ReactEventLoopFactory;
use ReactSocketConnector;
use ReactSocketConnectionInterface;

class WebSocketClient
{
    private $client;
    private $loop;

    public function __construct(string $url)
    {
        $this->loop = Factory::create();
        $this->client = new WebSocket($url, [], $this->loop);
    }

    /**
     * @param $data
     * @param int $opcode
     * @param bool $fin
     */
    public function send($data, $opcode = Frame::OP_TEXT, bool $fin = true)
    {
        $this->client->send(new Frame($data, true, $opcode, $fin));
    }

    /**
     * @return WebSocket
     */
    public function getClient(): WebSocket
    {
        return $this->client;
    }

    /**
     * @return ReactEventLoopLoopInterface
     */
    public function getLoop(): ReactEventLoopLoopInterface
    {
        return $this->loop;
    }

    /**
     * @param ConnectionInterface $conn
     */
    public function onClose(ConnectionInterface $conn)
    {
        echo "Connection closed: {$conn->getRemoteAddress()}
";
    }

    public function run()
    {
        $this->client->connect()
            ->then(function (WebSocket $conn) {
                echo "Connected
";
                $this->send('Hello, World!');
                $conn->on('message', function (Frame $msg) use ($conn) {
                    echo "Received: {$msg}
";
                    $conn->close();
                });
                $conn->on('close', function ($code = null, $reason = null) {
                    echo "Connection closed ({$code} - {$reason})
";
                });
            }, function (Throwable $e) {
                echo "Could not connect: {$e->getMessage()}
";
            });

        $this->loop->run();
    }
}

上記のコードでは、WebSocket クライアントを作成し、指定されたサーバーに接続できる WebSocketClient クラスを定義します。同時に、データを送信し、WebSocket 接続のクローズ イベントを処理するための send や onClose などのメソッドも提供します。 WebSocket クライアントを作成した後、Promise モードを使用して接続イベントを処理し、メッセージをリッスンしてイベントを閉じ、対応するイベントがトリガーされたときに処理します。

4. 概要

この記事では、PHP と WebSocket を使用してインスタント メッセージング機能を実装する方法を詳しく紹介し、WebSocket プロトコルの特徴と欠点をまとめます。 Ratchet ライブラリと Swoole 拡張機能を使用すると、WebSocket 機能を迅速に実装できます。同時に、WebSocket 通信の再利用性を向上させるために、WebSocket クライアント通信ツール クラスをカプセル化する方法も示します。この記事があなたのお役に立てば幸いです、読んでいただきありがとうございます。

以上がPHP と WebSocket を使用してインスタント メッセージング機能を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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