PHP と WebSocket: リアルタイム メッセージ プッシュの効率的なソリューション
Web アプリケーションでは、リアルタイム メッセージ プッシュが一般的な要件です。 HTTP プロトコルに基づく従来の要求/応答モデルはリアルタイム要件を満たすことができないため、リアルタイムのメッセージ プッシュを実現するには他のテクノロジを使用する必要があります。 WebSocket は、ブラウザとサーバーの間に永続的な接続を確立できるテクノロジーであり、リアルタイムのメッセージ プッシュを実現でき、従来のポーリング方式よりもパフォーマンスとサーバー リソースの点で優れています。
この記事では、PHP と WebSocket を使用してリアルタイム メッセージ プッシュを実装する方法を紹介し、具体的なコード例を示します。
WebSocket プロトコルは、ブラウザとサーバーの間に永続的な接続、リアルタイム通信を確立する全二重通信プロトコルです。 HTTP プロトコルとは異なり、WebSocket 接続は双方向であり、サーバーとクライアントはいつでも相互にメッセージを送信できます。
PHP では、Ratchet ライブラリを使用して WebSocket サーバーを実装できます。 Ratchet は、WebSocket サーバーを実装するためのさまざまな機能を提供する強力な PHP ライブラリです。
まず、Composer を使用して Ratchet ライブラリをインストールします:
composer require cboden/ratchet
次に、server.php
という名前の PHP ファイルを作成し、次のコードを追加します:
require 'vendor/autoload.php'; use RatchetMessageComponentInterface; use RatchetConnectionInterface; use RatchetServerIoServer; class Chat 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 ($client !== $from) { $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(); } } $server = IoServer::factory( new Chat(), 8080 ); $server->run();
上記のコードは、Ratchet の MessageComponentInterface インターフェイスを実装する Chat という名前のクラスを定義します。 onOpen、onMessage、onClose、onError メソッドでは、それぞれ新しい接続の確立、メッセージの受信、接続の終了、エラーが処理されます。
最後に、コマンド ラインを使用して WebSocket サーバーを起動します。
php server.php
ブラウザでは、JavaScript を使用して次のことを行うことができます。 WebSocket クライアント側を実装します。以下は簡単な例です:
var connection = new WebSocket('ws://localhost:8080'); connection.onopen = function() { console.log('Connected to WebSocket server'); }; connection.onmessage = function(event) { console.log('Received message: ' + event.data); }; connection.onclose = function() { console.log('Disconnected from WebSocket server'); };
上記のコードは WebSocket 接続を作成し、接続の確立、メッセージの受信、および接続の終了のイベントを処理します。
サーバー側では、必要に応じてメッセージ プッシュ ロジックを実装できます。たとえば、クリックするとメッセージをサーバーに送信し、接続されているすべてのクライアントにメッセージをブロードキャストするボタンがあるとします。
クライアント側では、WebSocket を通じてメッセージをサーバーに送信できます。以下に例を示します。
document.getElementById('button').addEventListener('click', function() { connection.send('Hello, World!'); });
サーバー側では、受信したメッセージを処理し、接続されているすべてのクライアントにメッセージをブロードキャストするように onMessage
メソッドを変更できます。例:
public function onMessage(ConnectionInterface $from, $msg) { $receivedMsg = $from->resourceId . ': ' . $msg; foreach ($this->clients as $client) { $client->send($receivedMsg); } }
上記のコードは、受信したメッセージにクライアントの resourceId を追加し、接続されているすべてのクライアントにブロードキャストします。
クライアント側では、connection.close()
メソッドを使用して WebSocket 接続を終了できます。例:
connection.close();
サーバー側では、接続終了のロジックは onClose
メソッドで処理できます。例:
public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); echo "Connection {$conn->resourceId} has disconnected "; }
上記のコードは、切断されたクライアントをクライアント リストから削除し、切断されたリソース ID を出力します。
上記の手順により、PHP と WebSocket を使用して、リアルタイム メッセージ プッシュの効率的なソリューションを実装できます。 WebSocket は永続的な接続と双方向通信機能を提供し、リアルタイムのメッセージ プッシュをより簡単かつ効率的にします。 Ratchet ライブラリを使用すると、WebSocket サーバーの実装が大幅に簡素化され、豊富な機能と使いやすい API が提供されます。
以上がPHP と WebSocket: リアルタイム メッセージ プッシュのための効率的なソリューションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。