Maison > Article > développement back-end > Quelle est la différence entre les programmes PHP bloquants et non bloquants ?
La différence entre les programmes PHP bloquants et non bloquants est la suivante : avant que le résultat de l'appel bloquant ne soit renvoyé, le thread actuel sera suspendu et l'appelant ne continuera pas à s'exécuter avant que le résultat de l'appel non bloquant ne soit renvoyé, l'appel ; ne bloquera pas le thread actuel. Vous pouvez continuer à exécuter vers le bas.
L'environnement d'exploitation de cet article : système Windows 10, PHP version 7.1, ordinateur Dell G3.
L'appel bloquant et non bloquant se concentre sur l'état du programme lors de l'attente du résultat de l'appel (message, valeur de retour).
L'appel bloquant signifie qu'avant le résultat de l'appel. le résultat de l'appel est renvoyé, le thread actuel est suspendu. Le thread appelant ne reviendra qu'après avoir obtenu le résultat.
Un appel non bloquant signifie que l'appel ne bloquera pas le fil de discussion en cours jusqu'à ce que le résultat ne puisse pas être obtenu immédiatement.
1.php Blocage de la concurrence
La concurrence est un problème pour PHP. Nous rencontrons souvent des requêtes avant d'écrire la bibliothèque pour déterminer si les données existent, mais si elles sont concurrentes, cela entraînera une duplication des données, et. votre jugement devient une fiction. Ainsi, avec le blocage, nous devons exécuter les requêtes une par une.
Une brève introduction :
1. Tout d'abord, ouvrez ou créez le fichier lock.txt en mode lecture et écriture
2 Ajoutez un "verrou exclusif" au fichier lock.txt, vous pouvez. passez à l'étape suivante du « traitement de la commande ». Données »
3. Après avoir traité les données, « libérez le verrou » et fermez le fichier ouvert
Remarque : après avoir donné au fichier un « verrouillage exclusif », s'il y a pas de "release lock" à l'intérieur, il y aura un
public function index(){ $fp = fopen("lock.txt", "w+"); if(flock($fp,LOCK_EX)) { $find=Db::name('user')->where('username','name2')->find(); if($find){ $data['username']='name3'; $data['password']=''; $data['password_m']=''; Db::name('user')->insert($data); }else{ $data['username']='name2'; $data['password']=''; $data['password_m']=''; Db::name('user')->insert($data); } flock($fp,LOCK_UN); } fclose($fp); return 'success'; }
très bloqué Remarque : c'est faisable pour une petite concurrence, et les performances n'auront pas un grand impact. Il est préférable que la simultanéité soit inférieure à 500. Si elle est trop élevée, il est recommandé d'utiliser le mode file d'attente.
Mode non bloquant 2.php
Le mode non bloquant est couramment utilisé dans les programmes php pour appeler des interfaces API tierces ou des programmes qui n'ont pas besoin d'attendre les résultats.
Donnez un exemple simple. Pour envoyer des e-mails, vous devez les envoyer à tous vos patrons, vous devez donc tous les envoyer une fois. Peut-être que vous devez écrire une boucle, donc la méthode d'envoi d'e-mails dans cette boucle nécessite du temps d'exécution, et vous devez obtenir le. renvoie la valeur et exécute-la la prochaine fois. Boucle, ce temps est accumulé en séquence, et le temps final sera très long
Ensuite, cela s'appelle le blocage, et ce que nous voulons toujours, c'est soumettre le passé, sans attendre le retour. données, vous pouvez simplement l'exécuter en boucle, alors ce à quoi nous pensons est le mode non bloquant. Pour ce genre de situation, PHP n'a pas de bonnes fonctions pour le gérer, donc ce que nous faisons le plus est de le mettre en file d'attente Lors de l'envoi d'e-mails,
s'exécute en fonction de la file d'attente, mais en fait, le mode de blocage est toujours. utilisé. Mais le temps d'exécution de notre requête sera très court. La méthode la plus couramment utilisée consiste à appeler l'interface API, et vous ne vous souciez pas de la valeur de retour pour le moment.
Apprentissage recommandé : "Tutoriel vidéo PHP"
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!