Cet article vous apporte une introduction détaillée (images et texte) sur le serveur d'écho multi-processus dans la programmation PHPSocket. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Le dernier programme de service d'écho présente un gros défaut, c'est-à-dire qu'il ne peut se connecter qu'à un seul client à la fois, ce qui est évidemment déraisonnable.
Cette fois, nous utilisons une approche multi-processus pour fournir des services à plusieurs clients en même temps.
Ce qui suit est l'effet final :
(Le processus de travail que nous avons créé peut être visualisé via la commande ps)
(Ouvrez plusieurs terminaux via xshell et connectez plusieurs clients au programme de service)
Commencer à coder Avant, Présentons ce qu'est un processus.
Un processus, c'est-à-dire un programme en cours d'exécution qui occupe de la mémoire, est un espace mémoire indépendant. Par exemple, lorsque l’on ouvre le logiciel Notepad sous Windows, cette opération équivaut à ouvrir un processus.
Le multi-processus consiste à créer plusieurs processus pour réaliser une chose ensemble.
Nous n'avons besoin que d'implémenter le programme côté serveur cette fois, et le client peut toujours utiliser le précédent. Si vous n’avez pas lu les articles précédents, vous pouvez consulter les articles historiques.
En PHP, on peut utiliser la fonction pcntl_fork pour créer un processus.
Ce qui suit est le prototype de la fonction :
int pcntl_fork ( void )
Explication officielle :
En cas de succès, le PID du processus enfant généré est renvoyé dans l'exécution du processus parent thread, et dans le processus enfant, renvoie 0 dans le thread d'exécution. En cas d'échec, -1 est renvoyé dans le contexte du processus parent, le processus enfant n'est pas créé et une erreur PHP est générée.
Pourquoi dit-on que c'est le thread exécuté par le processus parent ? Parce qu'un processus contient au moins un thread, et ce thread est le thread principal du processus.
Lorsque le processus parent appelle pcntl_fork, il copie également un processus enfant indépendant. Ce processus enfant a le même contexte que le processus parent. En d’autres termes, les deux processus partagent simplement le même code.
Entrez le processus de codage :
En exécutant la fonction pcntl_fork, un processus enfant est copié en même temps. time, si le contexte est L'environnement d'exécution du processus parent, la valeur de retour est le numéro de processus du processus enfant. S'il s'agit de l'environnement d'exécution d'un processus enfant, 0 est renvoyé. Par conséquent, dans la structure du programme suivant, les deux branches sont exécutées.
Le processus enfant a toujours la même logique qu'avant, utilisé pour recevoir les messages du client et les envoyer au client en même temps.
L'avant-dernière ligne appelle la fonction pcntl_waitpid Avant d'expliquer cette fonction, comprenons d'abord ce qu'est un processus zombie.
Normalement, le processus enfant est créé via le processus parent. Étant donné que les processus sont des structures de mémoire indépendantes, le processus parent ne connaît pas l'état d'exécution du processus enfant. Une fois que le processus enfant a terminé sa tâche, il ne peut pas se terminer tout seul. À ce stade, le processus parent doit obtenir le statut du processus enfant via le système d'exploitation pour recycler le processus enfant. Sinon, notre processus enfant deviendra une ressource poubelle, c'est-à-dire un processus zombie.
Ce qui suit est le prototype de cette fonction :
int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] )
Explication officielle :
Attendez ou renvoyez l'état du processus enfant de fork.
En fait, il y a un problème avec le code ci-dessus. Après avoir appelé pcntl_waitpid pour la première fois dans foreach, le processus principal est en fait bloqué à ce moment-là, attendant la sortie du premier processus enfant, tandis que l'autre enfant processus S'il se termine anormalement à ce moment-là, il ne sera pas recyclé par le processus principal et un processus zombie sera généré. Dans le développement réel, le processus principal doit encore faire autre chose.
La méthode non bloquante est donc recommandée ici. C'est très simple. Ajoutez simplement le troisième paramètre : WNOHANG. C'est-à-dire : pcntl_waitpid ($pid, $status, WNOHANG)
De cette façon, il peut revenir immédiatement sans que le processus enfant ne se termine, continuant ainsi à exécuter le code suivant.
Recommandations associées :
Pratique de programmation multi-processus PHP côté serveur
Programmation multi-processus PHP côté serveur Tutoriel practice_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!