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'); } }
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('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; }
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!