Maison > cadre php > Swoole > Comment faire une notification de message dans swoole

Comment faire une notification de message dans swoole

(*-*)浩
Libérer: 2019-12-09 09:29:14
original
2757 Les gens l'ont consulté

Comment faire une notification de message dans swoole

Créez une fonction de notification de message basée sur swoole et redis

Utilisez swoole pour démarrer le processus résident, vous en avez besoin de quelques-uns selon à votre propre situation Pour déterminer, le nombre de processus swoole doit être égal au nombre de cœurs de processeur du serveur (Apprentissage recommandé : tutoriel vidéo swoole )

Utilisez le processus résident démarré par swoole pour détecter en permanence redis Les valeurs dans la file d'attente peuvent être pondérées en fonction de la valeur clé, telle que rapide, moyenne et lente. Si un traitement urgent est requis, davantage de processus peuvent être utilisés pour de grandes quantités de données. un certain nombre de processus peuvent être alloués pour l’exécution.

Le code ci-dessous :

code de démarrage de 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');
    }
}
Copier après la connexion

swoole surveille les données dans la file d'attente Redis dans en temps réel, Classement par poids basé sur des valeurs clés

Code

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;
}
Copier après la connexion

La boucle for à l'intérieur est à utiliser avec la fonction sleep , et trois échecs peuvent être enregistrés. S'il échoue, vous pouvez le gérer manuellement. Ce qui précède est une simple fonction push de notification de message basée sur la file d'attente swoole et redis. La configuration spécifique peut être écrite dans la configuration ou stockée dans la base de données.

Ce qui est pratique est que vous pouvez séparer les modules en fonction de vos propres besoins, modules métier, et utiliser différentes valeurs clés et différentes opérations pour traiter vos propres messages, qui peuvent être traités très efficacement dans redis Les données

Le seul inconvénient est que la mémoire occupée par le processus est relativement élevée

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal