Heim > PHP-Framework > Swoole > So führen Sie eine Nachrichtenbenachrichtigung in Swoole durch

So führen Sie eine Nachrichtenbenachrichtigung in Swoole durch

(*-*)浩
Freigeben: 2019-12-09 09:29:14
Original
2747 Leute haben es durchsucht

So führen Sie eine Nachrichtenbenachrichtigung in Swoole durch

Erstellen Sie eine Nachrichtenbenachrichtigungsfunktion basierend auf Swoole und Redis

Verwenden Sie Swoole, um den Resident-Prozess zu starten. Sie benötigen entsprechend einige Um dies zu ermitteln, sollte die Anzahl der Swoole-Prozesse der Anzahl der Server-CPU-Kerne entsprechen (Empfohlenes Lernen: Swoole-Video-Tutorial )

Verwenden Sie den gestarteten residenten Prozess von swoole zur kontinuierlichen Erkennung von Redis Die Werte in der Warteschlange können entsprechend dem Schlüsselwert gewichtet werden, z. B. schnell, mittel und langsam. Wenn eine dringende Verarbeitung erforderlich ist, können für große Datenmengen im Allgemeinen mehrere Prozesse verwendet werden Es können mehrere Prozesse zur Ausführung zugewiesen werden.

Der folgende Code:

swoole-Startcode

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');
    }
}
Nach dem Login kopieren

swoole überwacht die Daten in der Redis-Warteschlange in Echtzeit, Rangfolge nach Gewicht basierend auf Schlüsselwerten

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;
}
Nach dem Login kopieren

Die darin enthaltene for-Schleife soll mit der Schlaffunktion verwendet werden, und Es können drei Fehler aufgezeichnet werden. Wenn ein Fehler auftritt, können Sie ihn manuell beheben. Das Obige ist eine einfache Push-Funktion für Nachrichtenbenachrichtigungen, die auf der Swoole- und Redis-Warteschlange basiert. Die spezifische Konfiguration kann in die Konfiguration geschrieben oder in der Datenbank gespeichert werden.

Das Praktische ist, dass Sie die Module nach Ihren eigenen Bedürfnissen und Geschäftsmodulen trennen und unterschiedliche Schlüsselwerte und unterschiedliche Vorgänge verwenden können, um Ihre eigenen Nachrichten zu verarbeiten, die sehr effizient verarbeitet werden können in redis Die Daten

Der einzige Nachteil ist, dass der vom Prozess belegte Speicher relativ hoch ist

Das obige ist der detaillierte Inhalt vonSo führen Sie eine Nachrichtenbenachrichtigung in Swoole durch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage