ホームページ > 記事 > PHPフレームワーク > Swooleでメッセージ通知を行う方法
swoole と redis をベースにしたメッセージ通知関数を作成します
swoole を使用して常駐プロセスを起動します。それに応じていくつか必要です。自分の状況に合わせて決定するには、swoole プロセスの数はサーバーの CPU コアの数と同じである必要があります (推奨学習: swoole ビデオ チュートリアル )
開始された常駐プロセスの使用swooleによりredisを継続的に検出するキュー内の値は、高速、中速、低速などのキー値に応じて重み付けできます緊急の処理が必要な場合は、大量のデータに対してより多くのプロセスを使用できます一般的に、異なる実行のために多数のプロセスを割り当てることができます。
以下のコード:
swoole 起動コード
function run() { try { $swoole = new \swoole_server(127.0.0.1, 9999); $swoole->set([ 'daemonize' => 1, //是否开启守护进程 'worker_num' => 8, //实际需要去设定 'log_file' => __APP_LOGS_PATH__ . '/swoole.log' ]); $swoole->on('WorkerStart', 'onWorkerStart'); $swoole->on('Receive', 'onReceive'); $swoole->start(); } catch (\Exception $e) { logs(['err_code' => $e->getCode(), 'err_msg' => $e->getMessage()], 'error'); } }
swoole は、redis キュー内のデータを監視します。リアルタイム、キー値に基づく重みによるランキング
コード
function onWorkerStart(swoole_server $swoole, $worker_id) { $chQuick = [0, 1, 2, 3]; $chNormal = [4, 5]; $chSlow = [6]; for ($i = 1; $i <= 3000; $i++) { $redis = connectRedis();//断线重连redis $queueData = $keys = []; if (in_array($worker_id, $chQuick)) { if ($redis->llen(QUEUE_QUICK)) $keys[] = QUEUE_QUICK; if ($keys) $queueData = $redis->brpop(QUEUE_QUICK, 5); } elseif (in_array($worker_id, $chNormal)) { if ($redis->llen(QUEUE_NORMAL)) $keys[] = QUEUE_NORMAL; if ($redis->llen(QUEUE_QUICK)) $keys[] = QUEUE_QUICK; if ($keys) $queueData = $redis->brpop(QUEUE_NORMAL, QUEUE_QUICK, 5); } elseif (in_array($worker_id, $chSlow)) { if ($redis->llen(QUEUE_SLOW)) $keys[] = QUEUE_SLOW; if ($redis->llen(QUEUE_NORMAL)) $keys[] = QUEUE_NORMAL; if ($redis->llen(QUEUE_QUICK)) $keys[] = QUEUE_QUICK; if ($keys) $queueData = $redis->brpop(QUEUE_SLOW, QUEUE_QUICK, QUEUE_NORMAL, 5); } else { if ($redis->llen(QUEUE_FAIL)) $keys[] = QUEUE_FAIL; if ($redis->llen(QUEUE_SLOW)) $keys[] = QUEUE_SLOW; if ($redis->llen(QUEUE_NORMAL)) $keys[] = QUEUE_NORMAL; if ($redis->llen(QUEUE_QUICK)) $keys[] = QUEUE_QUICK; if ($keys) $queueData = $redis->brpop(QUEUE_FAIL, QUEUE_QUICK, QUEUE_NORMAL, QUEUE_SLOW, 5); } logs('test'.$keys.'%%'.$queueData); if ($queueData) { $queueName = $queueData[0]; $message = $queueData[1]; if ($worker_id == QUEUE_FAIL_WORKER_ID && $queueName == QUEUE_FAIL) { call_user_func_array('retryPostMessage', [&$message, &$redis]); } else { call_user_func_array('postMessage', [&$message, &$redis]); } } else { sleep(5); } } sleep(10); $redis->close(); unset($redis); method_exists($swoole, 'stop') ? $swoole->stop() : @exit; }
内部の for ループは sleep 関数で使用されます。失敗は記録できます。失敗した場合は手動で対処できます。上記は swoole と redis キューをベースにしたシンプルなメッセージ通知プッシュ機能で、具体的な設定は設定に記述するか、データベースに保存することができます。
便利な点は、独自のニーズやビジネス モジュールに応じてブロックごとにモジュール分離を実行でき、さまざまなキー値とさまざまな操作を使用して独自のメッセージを処理できることです。データは redis で非常に効率的に処理されます。
唯一の欠点は、プロセスによって占有されるメモリが比較的多いことです。
以上がSwooleでメッセージ通知を行う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。