Redis est une base de données de valeur clé à haute performance basée sur la mémoire qui est largement utilisée dans les scénarios de mise en cache, de file d'attente et de publication de messages et d'abonnement. Dans le développement de PHP, avec l'aide de Redis Extension, nous pouvons facilement implémenter l'écoute continue des messages Redis, répondant ainsi aux messages publiés et en traitement en temps réel.
Avant d'utiliser la fonction redis, assurez-vous que l'extension redis est installée dans l'environnement PHP. Il peut être installé via PECL, avec les commandes suivantes:
<span class="fun">PECL Installer Redis</span>
Une fois l'installation terminée, vous devez l'ajouter dans le fichier de configuration PHP.ini:
<span class="fun">extension = redis.so</span>
Après avoir terminé la configuration, redémarrez le service PHP et utilisez normalement l'extension redis.
Redis fournit des commandes d'abonnement et de publication pour l'abonnement et la publication des messages, respectivement. Dans PHP, en appelant la méthode d'abonnement , vous pouvez écouter en permanence des messages à partir du canal spécifié et traiter les messages reçus via la fonction de rappel.
<?php
$redis = new Redis();
$redis->connect('localhost', 6379);
$redis->subscribe(['channel'], function($redis, $channel, $message) {
// Traitement des messages reçus
echo "Received message from channel {$channel}: {$message}\n";
});
Dans le code ci-dessus, créez une instance Redis et connectez-vous au serveur Redis, abonnez-vous à un canal nommé canal et imprimez le message reçu dans la fonction de rappel.
Le modèle d'abonnement à processus unique ne peut pas répondre aux besoins des scénarios de concurrence élevés. En utilisant la technologie multi-traitement, plusieurs processus de consommation peuvent être démarrés et les messages peuvent être traités en même temps, améliorant le débit du système.
<?php
$redis = new Redis();
$redis->connect('localhost', 6379);
// Nombre de processus créés,Ajuster en fonction de la demande
$numWorkers = 4;
for ($i = 0; $i < $numWorkers; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
die("Could not fork");
} elseif ($pid) {
// Processus parental,Continuez à créer le prochain processus enfant
continue;
} else {
// Sous-processus,Exécuter la logique de traitement de l'abonnement et des messages
$redis->subscribe(['channel'], function($redis, $channel, $message) {
// Traitement des messages reçus
echo "Received message from channel {$channel}: {$message}\n";
});
break;
}
}
// 等待Sous-processus退出
while (pcntl_waitpid(0, $status) != -1) {}
Dans le code, plusieurs sous-processus sont créés à l'aide de PCNTL_FORK () , chacun s'abonne à des messages indépendamment pour réaliser un traitement simultané. Le processus parent est responsable de la création du processus enfant et de l'attente de sa fin.
Étant donné que Redis Extension adopte des IO non bloquantes et que les abonnements multi-processus peuvent déclencher des conditions de course, il est recommandé de mettre en œuvre un mécanisme de verrouillage raisonnable basé sur des scénarios spécifiques pour garantir la coordination inter-processus et la sécurité des données.
Cet article présente comment écouter en continu les abonnements Redis Message via l'extension redis en PHP et utiliser la technologie multi-traitement pour traiter efficacement de grandes quantités de messages simultanément. Cette solution est non seulement concise et pratique, mais améliore également considérablement les performances de traitement des messages, ce qui convient aux scénarios d'application qui nécessitent une réponse en temps réel et un traitement de messages à grande échelle.