ホームページ  >  記事  >  バックエンド開発  >  PHP を使用してロングポーリングパブリッシュ/サブスクライブパターンを実装する方法

PHP を使用してロングポーリングパブリッシュ/サブスクライブパターンを実装する方法

PHPz
PHPzオリジナル
2023-04-05 10:31:25719ブラウズ

現代の Web 開発では、リアルタイム通信が非常に重要な要件となっており、メッセージ キューとパブリッシュ/サブスクライブ モデルは、Web アプリケーションでリアルタイム通信を実現するための標準ソリューションとなっています。この記事では、PHP を使用してロング ポーリング パブリッシュ/サブスクライブ モードを実装する方法を紹介します。

ロングポーリングとは何ですか?

従来の Web アプリケーションでは、クライアントはサーバーにリクエストを送信し、サーバーはリクエストを受信するとすぐに応答を返します。ロング ポーリングは、より高度な Web アプリケーション アーキテクチャであり、サーバーがクライアント要求を受信した後、一定時間待機して新しいメッセージがあるかどうかを判断できます。新しいメッセージがない場合、接続はメッセージが表示されるまで維持されます。新しいメッセージ 新しいメッセージが到着すると、応答がクライアントに返されます。

したがって、ロング ポーリングの実装は、従来の要求応答モードよりも効率的であり、サーバー リソースを節約し、リアルタイム通信のニーズにより適合します。

PHP を使用してロングポーリングを実装するにはどうすればよいですか?

以下では、PHP とメッセージキューを使用してロングポーリングを実装する方法を紹介します。

  1. メッセージ キューのインストール

PHP を使用してロング ポーリングを実装する前に、メッセージ キューをインストールする必要があります。現在一般的なメッセージ キューには、RabbitMQ、ZeroMQ、Beanstalkd などがあります。この記事では、Beanstalkd を使用してメッセージ キューを実装します。

まず、Beanstalkd をダウンロードしてインストールする必要があります。 Ubuntu システムでは、次のコマンドを使用してインストールできます:

sudo apt-get install Beanstalkd

他のオペレーティング システムを使用している場合は、Beanstalkd 公式 Web サイトから適切なバージョンをダウンロードできます。インストールします。

インストールが完了したら、次のコマンドを使用して Beanstalkd を起動できます:

sudo service Beanstalkd start

  1. PHP コードの書き込み

以下では、例を使用して、Beanstalkd を使用して PHP でロングポーリングを実装する方法を示します。

まず、PHP ファイルで Beanstalkd を接続します。

$beanstalk = new Pheanstalk('127.0.0.1');

次に、メッセージ パブリッシング関数を定義する必要があります。 :

function public($channel, $message){

global $beanstalk;
$data = json_encode(array('channel' => $channel, 'message' => $message));
$beanstalk->useTube("pubsub")
          ->put($data, Pheanstalk::DEFAULT_PRIORITY, 0, 10);

}

この関数の機能は、「pubsub」という名前のパイプにメッセージを送信することです。必要に応じて、さまざまなパイプにメッセージを送信できます。

次に、メッセージをサブスクライブする関数を定義する必要があります:

function subscribe($channel, $callback){

global $beanstalk;
$beanstalk->watch($channel);
while (true) {
    $job = $beanstalk->reserve();
    if ($job) {
        $data = json_decode($job->getData(), true);
        if ($data['channel'] == $channel) {
            call_user_func($callback, $data['message']);
            $beanstalk->delete($job);
            break;
        } else {
            $beanstalk->bury($job);
        }
    }
}

}

この関数の機能は、指定されたパイプをリッスンすることであり、メッセージが到着すると、$callback 関数を実行して、キューからメッセージを削除します。

次に、クライアント側で JavaScript コードを使用してロングポーリングを実装する必要があります。

  1. クライアント JavaScript コード

クライアントでは、2 つの関数を定義する必要があります。 1 つはメッセージを送信する関数であり、もう 1 つはメッセージを受信する関数です。以下はサンプル コードです:

function public(channel, message){

// 发送消息
$.ajax({
    type: 'POST',
    url: 'publish.php',
    data: {channel: channel, message: message},
    success: function(data){}
});

}

function submit(channel, callback){

// 接收消息
function poll(){
    $.ajax({
        type: 'GET',
        url: 'subscribe.php',
        data: 'channel=' + channel,
        dataType: 'json',
        success: function(data){
            if (data && data.message){
                callback(data.message);
            }
            poll();
        },
        error: function(){
            setTimeout(poll, 5000);
        }
    });
}
poll();

}

この例では、jQuery を使用して、メッセージを送信するための POST リクエストと、メッセージを受信するための GET リクエストを送信します。

ロングポーリングでは、クライアントは応答を受信するまで接続を維持することに注意してください。サーバーがアイドル状態のときに接続を閉じないようにするには、タイムアウトを防ぐために次のコードをページに追加する必要があります。

この例では、ページは 600 秒ごとに更新されます。

結論

PHP とメッセージ キューを使用すると、ロング ポーリング パブリッシュ/サブスクライブ モードを簡単に実装して、リアルタイム通信のニーズを実現できます。この方法は、Web アプリケーションでのリアルタイムのデータ交換と通信で非常に一般的に使用されており、アプリケーションでサーバーのパフォーマンスを消費するポーリングやその他の方法の使用を大幅に削減し、Web アプリケーションのスケーラビリティを向上させることができます。

以上がPHP を使用してロングポーリングパブリッシュ/サブスクライブパターンを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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