ホームページ  >  記事  >  バックエンド開発  >  PHP API開発におけるロングポーリングとWebSocketへの対処方法

PHP API開発におけるロングポーリングとWebSocketへの対処方法

PHPz
PHPzオリジナル
2023-06-17 08:52:141281ブラウズ

インターネットとモバイル インターネットの発展に伴い、リアルタイム通信機能を実装する必要があるアプリケーションがますます増えています。 Web 開発では、リアルタイム通信機能を実装できる 2 つのプロトコルとして、Long Polling と WebSocket がよく使用されます。 PHP API開発においては、Long PollingやWebSocketへの対応が検討すべき課題となります。

1. Long Polling

Long Polling(ロングポーリング)は、リアルタイム通信を実現する技術です。その基本原理は、クライアントがサーバーにリクエストを送信すると、サーバーはリクエストにすぐに応答せず、接続を開いたままにし、新しいデータを待ってからクライアントにデータを返します。その後、クライアントはリクエストを再送信します。データ受信後。

PHP API 開発におけるロング ポーリングの処理方法は、接続を開いたままにしてデータが返されるのを待つ必要がある点を除けば、通常のリクエストの処理方法と似ています。以下はサンプル コードです:

<?php
// 开启一个长轮询连接
while(true) {
    // 查询是否有新的数据
    $new_data = get_new_data();
    if(!empty($new_data)) {
        // 返回查询到的新数据
        echo json_encode($new_data);
        // 关闭连接,等待下一次请求
  exit;
    }
    // 等待一段时间再次查询
    sleep(1);
}
?>

上記のコードでは、while ループを使用して接続を開いたままにし、新しいデータがクライアントに返されるのを待ち、クエリを実行するまでの一定期間待機します。新しいデータがあるかどうかを再度確認します。この方法は、各接続がプロセスを占有するため、同時実行性の高いシナリオには適していません。同時に長いポーリングを実行するクライアントが多数ある場合、サーバーはすぐに使い果たされてしまいます。

この問題を解決するには、イベント リスナーまたはメッセージ キューを使用してロング ポーリング リクエストを処理します。新しいデータがある場合は、イベント リスナーをトリガーするかメッセージ キューにプッシュし、ロング ポーリング接続を使用してデータを取得します。これにより、サーバーの負荷が軽減され、システムの安定性が向上します。以下は、Redis を使用してロング ポーリング リクエストを処理するためのサンプル コードです:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);

// 开启一个长轮询连接
while(true) {
    $new_data = $redis->subscribe(['new_data']);
    if(!empty($new_data)) {
        // 返回新数据
        echo json_encode($new_data);
        // 关闭连接,等待下一次请求
  exit;
    }
}
?>

上記のコードでは、Redis の submit メソッドを使用して新しいデータのプッシュを監視します。クライアントに返され、接続が終了します。この方法はサーバー リソースを占有せず、同時実行性の高いリアルタイム通信シナリオに適しています。

2. WebSocket

WebSocket は、リアルタイム通信を実現するためのもう 1 つのテクノロジであり、クライアントとサーバーの間に双方向の永続的な接続を確立して、リアルタイム通信を実現できます。 WebSocket では、接続の確立と切断を繰り返す必要がなく、クライアントとサーバーの間でメッセージを送信できるため、通信効率が大幅に向上します。

PHP API 開発では、Ratchet、Swoole などのサードパーティ ライブラリを使用して WebSocket を処理できます。 WebSocket プロトコルはこれらのライブラリを使用して簡単に実装でき、さまざまなカスタム プロトコルやイベントもサポートできるため、開発が非常に便利になります。以下は、Ratchet を使用して WebSocket を処理するためのサンプル コードです:

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

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;
use RatchetServerIoServer;
use RatchetHttpHttpServer;
use RatchetWebSocketWsServer;

// 实现一个聊天服务
class Chat implements MessageComponentInterface {
    protected $clients;

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

    public function onOpen(ConnectionInterface $conn) {
        // 新的客户端连接
        $this->clients->attach($conn);
    }

    public function onMessage(ConnectionInterface $conn, $msg) {
        // 收到客户端消息
        foreach ($this->clients as $client) {
            if ($conn === $client) {
                continue;
            }
            $client->send($msg); // 发送消息给其他客户端
        }
    }

    public function onClose(ConnectionInterface $conn) {
        // 客户端断开连接
        $this->clients->detach($conn);
    }

    public function onError(ConnectionInterface $conn, Exception $e) {
      // 出错时的处理
    }
}

// 启动聊天服务
$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    8080
);
$server->run();
?>

上のコードでは、Ratchet を使用して単純なチャット サービスを実装します。クライアントが接続すると、onOpen メソッドがトリガーされます。クライアントがメッセージを送信すると onMessage メソッドがトリガーされ、クライアントが切断すると onClose メソッドがトリガーされ、エラーが発生すると onError メソッドがトリガーされます。このサービスでは、クライアントが送信したメッセージを他のクライアントにブロードキャストするだけで、簡易的なチャット ルームを実装します。

概要

PHP API 開発では、ロング ポーリングと WebSocket を処理するためにさまざまなテクノロジとメソッドを使用できます。ロング ポーリング方法は比較的単純で、while ループを使用して新しいデータの到着を待つことができますが、サーバー リソースを占有します。 WebSocket メソッドは比較的複雑で、サードパーティのライブラリを使用して実装できますが、さまざまなカスタム プロトコルやイベントもサポートできるため、開発が非常に便利です。どの方法を使用する場合でも、システムの安定性と信頼性を確保するには、サーバーのリソース使用量とパフォーマンスの問題を考慮する必要があります。

以上がPHP API開発におけるロングポーリングとWebSocketへの対処方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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