PHPはredisサブスクリプションとパブリッシングを実装します(非同期タスク処理用)

1.コンセプト
名と意味
チャネルチャネル:プロデューサーとコンシューマー
パブリッシュプロデューサーによって直接操作されるオブジェクト:メッセージをチャネルに送信します
サブスクライブコンシューマー:1つ以上のチャネルにサブスクライブします
psubscribeコンシューマー:1つ以上のチャネルにサブスクライブするために一致します
punsubscribe unsubscribe :unsubscribeに一致し、パラメータなしですべてのチャネルを
サブスクライブ解除するunsubscribe Unsubscribe:指定チャネルをサブスク
ライブ解除し、パラメータなしですべてのチャネルをサブスクライブ解除しますpubsub現在アクティブなチャネルをリストします(少なくとも1つのサブスクリプション)

2.注意事項
1)プロデューサーはメッセージをパブリッシュするときに接続を開き、接続はパブリッシュ直後に閉じることができます
。2)チャネルはパブリッシュによって送信されたメッセージのみを受信します。メッセージは保存されません。チャネルがサブスクライブされていない場合、メッセージは破棄されます
。3)サブスクリプションの消費ユーザーは常にオンラインである必要があり、メッセージへのアクセスをブロックし、接続を解除すると、すぐに登録を解除できます

3. Redisはパブリッシュサブスクリプションとメッセージキューの機能を実現できます。この2つの違いは次のとおりです
。1)Redisサブスクライバーは複数であり、サブスクライバーがオンラインでない場合(サービスが開始されていない場合)、投稿されたメッセージを同時に処理できます。失われ、メッセージは保持されません。パブリッシュとサブスクライブは一緒に実行されます。このメッセージは無視してください
。2)メッセージキューは1つのクライアントでのみ処理できます。処理後、メッセージはマークまたは削除されます。サーバーがメッセージを開始しなくても、メッセージは失われません
。3)2つユーザーの使用シナリオは、ビジネスデータの正確性と機密性に応じて決定する必要があります。たとえば、ログはredis publishおよびsubscribeを使用して実装できます。ログが失われたかどうかは問題ではありません。

4. php-redis拡張機能が提供するメソッドを直接使用して、パブリッシュとサブスクライブを実装します
1)コンシューマサブスクリプションSubscribe.php
<?Php
// phpスクリプトの実行時間を設定します
set_time_limit(0);
//ソケット接続タイムアウト時間を設定します
ini_set( 'default_socket_timeout'、 -1);
//テストチャネル名を宣言します
$ channelName = "testPubSub";
$ channelName2 = "testPubSub2";
try {
  $ redis = new Redis();
  //長いリンクを作成します
  $ redis-> pconnect( 'ip'、 6379);
  //メッセージの取得をブロック
  $ redis-> subscribe(array($ channelName、$ channelName2)、function($ redis、$ chan、$ msg){
    echo "channel:"。$ Chan。 "、Message:"。 $ msg。 "\ n";
  });
} catch(例外$ e){
  echo $ e-> getMessage();
}

2)プロデューサーがメッセージを送信するPublish.php
<?Php
$ channelName = "testPubSub";
$ channelName2 = "testPubSub2";
//指定したチャネルにメッセージを送信
try {
  $ redis = new Redis();
  $ redis-> connect( ' 192.168.75.132 '、6379);
  for($ i = 0; $ i <5; $ i ++){
    $ data = array(' key '=>' key '。$ I、' data '=>' testdata ') ;
    $ ret = $ redis-> publish($ channelName、json_encode($ data));
    print_r($ ret);
  }
} catch(Exception $ e){
  echo $ e-> getMessage();
}

3)コンシューマーサブスクリプションを実行し、php Subscribe.phpのブロックを開始します。

4)プロデューサーを実行し、メッセージphp Publish.phpの送信を開始します

php。\ Publish.php
22222
実行結果に戻る
コンシューマターミナルでチャネルサブスクリプション数を表示します

php。\ Subscribe.php
channel:testPubSub、message:{"key": "key0"、 "data": "testdata"}
channel:testPubSub、message:{"key": "key1"、 "data": "testdata "}
channel:testPubSub、message:{" key ":" key2 "、" data ":" testdata "}
channel:testPubSub、message:{" key ":" key3 "、" data ":" testdata "}
チャネル: testPubSub、message:{"key": "key4"、 "data": "testdata"}

送信元:https://www.jmsite.cn/blog-586.html

 

おすすめ

転載: www.cnblogs.com/WebLinuxStudy/p/12749998.html