Maison  >  Article  >  développement back-end  >  L'asynchronie est-elle si importante dans un seul processus ?

L'asynchronie est-elle si importante dans un seul processus ?

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-07-16 16:17:161308parcourir

De manière générale, les programmes en php sont à processus unique et la phrase suivante ne sera exécutée que lorsqu'une phrase sera exécutée. Mais s’il reste bloqué sur un certain lien, alors il n’y a aucun moyen d’exécuter le programme. Nous avons besoin d’un autre mécanisme pour résoudre ce problème, qui est asynchrone.

L'asynchronie est-elle si importante dans un seul processus ?

Dans des circonstances normales, le programme en PHP est un processus unique. Après avoir exécuté une phrase, il passera à la phrase suivante (la série de fonctions pcntl_fork() de PHP n'est pas utilisée ici, ma méthode est bien meilleure. que ça), tout comme un groupe de personnes bien éduquées et affamées (qui peuvent mourir si elles ne mangent pas ces deux repas, et tout le monde veut manger ce repas le plus rapidement possible) font la queue pour acheter des repas. Il faut finir le repas avant le suivant, si une personne prend un changement qui est entièrement de 1 jiao, elle doit compter le 1 jiao et le 1 jiao avant de pouvoir prendre le suivant.

Ce n'est peut-être pas un problème si vous êtes un instant ou deux en retard dans la file d'attente pour acheter de la nourriture, mais dans un système qui doit répondre rapidement aux utilisateurs, ce phénomène sera gênant si ce phénomène se produit, tout comme une connexion complète. l'opération est divisée en plusieurs étapes. Si elle est exécutée étape par étape, si elle est bloquée en une seule étape, elle sera terminée. L'utilisateur verra que le bouton de chargement continue de tourner... A ce moment, un mécanisme est nécessaire pour. résoudre ce problème.

Tout d'abord, découvrons l'extension de communication inter-processus de PHP, sysvmsg. Il convient de noter ici que cette extension ne peut être utilisée que sous Linux/Uinux et n'est pas valide sur d'autres plateformes. L'extension est très simple :

yum -y install php-process

Bien sûr, le principe est que vous avez installé php. Après l'avoir exécuté, utilisez la commande suivante pour vérifier si l'installation a réussi :

php -m | grep sysvmsg
#若果看到sysvmsg说明安装成功了

#或者也可以这样
php -r 'var_dump(function_exists("msg_get_queue"))';
#若果看到true说明安装成功了

Bien sûr, la commande ci-dessus doit ajouter le php. chemin d'accès à la variable d'environnement système.

Cette extension peut communiquer entre les processus, voyons un exemple ci-dessous.

Envoyer, envoyer.php

#!/usr/bin/php
#上面的是我自己的php路径
<?php
$ip = msg_get_queue(12340);
//创建一个队列
msg_send($ip,1,"Test a message",false,false,$err);//像队列中塞一条消息

Recevoir, recevoir.php

#!/usr/bin/php
<?php
$ip = msg_get_queue(12340);
//创建消息队列,和发送的要一致,不然收不到消息
while(msg_receive($ip,0,$msgtype,512,$data,false,null,$err)){
    echo "使用内存: ".memory_get_usage()."\n";
    //这里看下使用了多少内存
    echo "收到的消息: $data\n";
    //收到的消息在这里
}

En exécutant le programme, vous pouvez constater que l'envoi et la réception de messages suivent le FIFO standard de la file d'attente, afin que nous puissions concevoir un système asynchrone basé sur ces caractéristiques.

Comment utiliser ces fonctionnalités ? Pensez-y de cette façon, il y aura certainement de nombreuses opérations lorsque le programme est exécuté. Certaines opérations doivent être effectuées tout le temps, tandis que certaines opérations peuvent être retardées et certaines opérations ne sont pas importantes dans le processus. première place. Cela prend beaucoup de temps.

Par exemple, l'enregistrement des journaux de connexion et l'enregistrement des détails du jeu. Pour le moment, nous n'avons pas besoin d'attendre que le programme soit exécuté (si nous attendons, des problèmes peuvent survenir et beaucoup de temps sera perdu lorsqu'il y en a). trop d'opérations sans importance). Il s'agit de jeter directement les choses à opérer dans la file d'attente.

Ensuite, ouvrez un processus séparé en arrière-plan pour exécuter le message reçu, tout comme dans recevoir.php, il continue d'attendre là quand il y a un message, il s'exécutera, et quand il n'y a pas de message, il se bloquera. est-ce une solution réussie ? Cela résout le problème de la perte de temps en n'exécutant pas le programme immédiatement lorsqu'il est en cours d'exécution.

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer