ホームページ  >  記事  >  PHPフレームワーク  >  Swooleでメッセージ通知を行う方法

Swooleでメッセージ通知を行う方法

(*-*)浩
(*-*)浩オリジナル
2019-12-09 09:29:142699ブラウズ

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(&#39;test&#39;.$keys.&#39;%%&#39;.$queueData);
        if ($queueData) {
            $queueName = $queueData[0];
            $message = $queueData[1];
            if ($worker_id == QUEUE_FAIL_WORKER_ID && $queueName == QUEUE_FAIL) {
                call_user_func_array(&#39;retryPostMessage&#39;, [&$message, &$redis]);
            } else {
                call_user_func_array(&#39;postMessage&#39;, [&$message, &$redis]);
            }
        }
        else
        {
            sleep(5);
        }
    }
sleep(10);
    $redis->close();
    unset($redis);
    method_exists($swoole, &#39;stop&#39;) ? $swoole->stop() : @exit;
}

内部の for ループは sleep 関数で使用されます。失敗は記録できます。失敗した場合は手動で対処できます。上記は swoole と redis キューをベースにしたシンプルなメッセージ通知プッシュ機能で、具体的な設定は設定に記述するか、データベースに保存することができます。

便利な点は、独自のニーズやビジネス モジュールに応じてブロックごとにモジュール分離を実行でき、さまざまなキー値とさまざまな操作を使用して独自のメッセージを処理できることです。データは redis で非常に効率的に処理されます。

唯一の欠点は、プロセスによって占有されるメモリが比較的多いことです。

以上がSwooleでメッセージ通知を行う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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