PHP utilise blPop/brPop de redis, et un serveur ne peut l'exécuter qu'une seule fois à la fois ?
phpcn_u1582
phpcn_u1582 2017-05-16 12:59:45
0
2
787

Le serveur utilise l'architecture nginx php-fpm et redis utilise connect pour se connecter. Chaque requête réseau doit avoir un processus php-fpm distinct. J'ai écrit une boucle avec blPop/brPop et sleep(5) dans la boucle. Le navigateur a ouvert deux onglets et les a exécutés, puis lpush a chargé 4 données dans list et a constaté que l'onglet qui s'exécutait toujours en premier pouvait lire les deux premières données. En d'autres termes, blPop/brPop bloque tous les autres blPop/brPop sur l'ensemble du serveur qui écoutent la même clé ?
Voici le code que j'ai testé :

//堵塞出队列
public function test(){
    tool::load('hRedis.php');
    $timeOut = 20;//堵塞20秒

    $cn = 'test_blist';

    $ress = [];
    for($i=0;$i<2;$i++){
        $ress[] = hRedis::cacheListBPop($cn,$timeOut);//这里面封装了redis的blPop/brPop
        sleep(5);
    }

    print_r($ress);
}

Pourquoi le processus qui s'exécute plus tard est-il toujours bloqué pendant la période de veille du processus qui s'exécute en premier ?

Nous avons effectué des tests plus approfondis, supprimé la boucle, exécuté chaque processus une seule fois et utilisé redis->close() après chaque lecture. Nous avons constaté que l'heure de fin des deux processus différait encore d'environ 16 secondes.

Pour le dernier test, je l'ai mis à nouveau sur deux serveurs. Cette fois, il ne s'agissait pas de deux processus sur le même serveur, mais de deux serveurs. J'ai constaté que l'heure de fin des deux serveurs, le nombre de secondes différent, était. le nombre de secondes que j'ai insérées dans les deux serveurs. Le temps entre les données ! Pas de retard cette fois-ci !

phpcn_u1582
phpcn_u1582

répondre à tous(2)
某草草

Tout d'abord, Redis est monothread et toutes les requêtes envoyées au serveur sont mises en file d'attente et exécutées dans l'ordre. Vous avez donc dit que chaque requête réseau devrait avoir un processus distinct, ce qui, à mon avis, est incorrect. , pas côté serveur, sinon ce sera fatal pour Redis monothread,
Après avoir ouvert deux onglets, cela équivaut à ouvrir 2 clients avant d'ouvrir 2 onglets et il n'y a pas de données push, ces 2 clients sont tous les deux. en état de blocage et votre temps de blocage est défini sur 20 secondes.
Lorsque vous transmettez les données dans la liste, les deux clients effectuent l'opération brpop sur la même clé, puis le client qui exécute la commande brpop en premier peut obtenir la valeur pop. , c'est-à-dire la première page à onglet. dormez 5 secondes, affichez d'autres données, puis affichez-les. Après la fermeture du premier client, si le deuxième client exécute toujours la ligne pop, je pense qu'il devrait afficher les valeurs suivantes si l'intervalle d'ouverture est atteint. entre les deux clients est très court, il va probablement sortir. Vous pouvez ajuster l'intervalle de temps d'ouverture entre les deux clients et le tester. Ensuite, dites-moi la réponse. Merci
.

Peter_Zhu

La phrase "Chaque demande réseau doit avoir un processus distinct" est fausse et a été remplacée par "Chaque demande réseau doit avoir un processus php-fpm distinct".
La deuxième question est comme vous l'avez dit, le deuxième client affichera les valeurs suivantes, mais le moment où le deuxième client affichera la valeur est en moyenne 16 secondes plus tard que le premier client. Je veux savoir pourquoi il est si tard, n'est-ce pas. être raccourci ? Pourquoi le deuxième client ne peut-il pas écouter en même temps que le premier client ?

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal