Maison développement back-end tutoriel php Introduction détaillée du serveur d'écho multi-processus dans la programmation PHPSocket (image et texte)

Introduction détaillée du serveur d'écho multi-processus dans la programmation PHPSocket (image et texte)

Sep 13, 2018 pm 05:11 PM
linux php socket

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 :

Introduction détaillée du serveur décho multi-processus dans la programmation PHPSocket (image et texte)

(Le processus de travail que nous avons créé peut être visualisé via la commande ps)

Introduction détaillée du serveur décho multi-processus dans la programmation PHPSocket (image et texte)

(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 )
Copier après la connexion

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 :

Introduction détaillée du serveur décho multi-processus dans la programmation PHPSocket (image et texte)

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 ] )
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian

Entrée de la version Web Deepseek Entrée du site officiel Deepseek Entrée de la version Web Deepseek Entrée du site officiel Deepseek Feb 19, 2025 pm 04:54 PM

Entrée de la version Web Deepseek Entrée du site officiel Deepseek

Comment installer Deepseek Comment installer Deepseek Feb 19, 2025 pm 05:48 PM

Comment installer Deepseek

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Comment configurer Visual Studio Code (VS Code) pour le développement PHP

Comment analysez-vous et traitez-vous HTML / XML dans PHP? Comment analysez-vous et traitez-vous HTML / XML dans PHP? Feb 07, 2025 am 11:57 AM

Comment analysez-vous et traitez-vous HTML / XML dans PHP?

Programme PHP pour compter les voyelles dans une chaîne Programme PHP pour compter les voyelles dans une chaîne Feb 07, 2025 pm 12:12 PM

Programme PHP pour compter les voyelles dans une chaîne

Installation officielle du site officiel de Bitget (Guide du débutant 2025) Installation officielle du site officiel de Bitget (Guide du débutant 2025) Feb 21, 2025 pm 08:42 PM

Installation officielle du site officiel de Bitget (Guide du débutant 2025)

Le package d'installation OUYI OKX est directement inclus Le package d'installation OUYI OKX est directement inclus Feb 21, 2025 pm 08:00 PM

Le package d'installation OUYI OKX est directement inclus

See all articles