Une étude préliminaire sur plusieurs processus en PHP7
Préparation
Nous savons tous que PHP s'exécute en un seul processus. La gestion de la multi-concurrence par PHP repose principalement sur le multi-processus du serveur ou PHP-FPM et du serveur. réutilisation de leurs processus, mais PHP L'implémentation de plusieurs processus est également d'une grande importance, en particulier lors du traitement de grandes quantités de données ou de l'exécution de processus démons DEMON
en arrière-plan en mode Cli en arrière-plan.
Le multi-threading de PHP a également été mentionné, mais le problème du partage et de l'allocation des ressources multi-thread au sein du processus est difficile à résoudre. PHP possède également une extension multi-thread pthreads
, mais elle est dite instable et nécessite que l'environnement soit thread-safe, elle n'est donc pas beaucoup utilisée.
Dans le passé, un grand maître du groupe PHP a dit un jour que si PHP en arrière-plan veut progresser, il doit éviter le multi-processus. Il se trouve que le processus démon de l'entreprise utilise également le multi-processus de PHP. processus, combiné avec les différents de Gu Ge Après avoir lu les informations et les manuels, j'ai enfin compris le multi-traitement et écrit une petite démo (implémentée sur un système Linux, je la résumerai dans cet article). S'il y a des erreurs ou des omissions, merci. vous de les avoir mentionnés.
Pour implémenter le multi-traitement en PHP, nous avons besoin de deux extensions pcntl
et posix
La méthode d'installation ne sera pas décrite ici.
En php, nous utilisons pcntl_fork()
pour créer plusieurs processus (dans la programmation en langage C des systèmes *NIX, les processus existants génèrent de nouveaux processus en appelant la fonction fork). Le nouveau processus après le fork devient le processus enfant, le processus d'origine devient le processus parent et le processus enfant possède une copie du processus parent. Notez ici :
• Le processus enfant partage le segment de texte du programme avec le processus parent
• Le processus enfant a une copie de l'espace de données, du tas et de la pile du processus parent. Notez que c'est le cas. une copie, pas un partage
• Le processus parent et le processus enfant continueront à exécuter le code du programme après le fork
• Après le fork, que le processus parent ou le processus enfant s'exécute d'abord ne peut pas être confirmé, et cela dépend de la planification du système (dépend de la croyance)
Il est dit ici que le processus enfant a une copie de l'espace de données, du tas et de la pile du processus parent. dans la plupart des implémentations, il ne s'agit pas d'une véritable copie complète. Plus important encore, la technologie COW (Copy On Write) est utilisée pour économiser de l'espace de stockage. Pour faire simple, si ni le processus parent ni le processus enfant ne modifient ces données, ce tas et cette pile, alors le processus parent et le processus enfant partagent temporairement les mêmes données, tas et pile. Ce n'est que lorsque le processus parent ou le processus enfant tente de modifier les données, le tas et la pile qu'une opération de copie se produit. C'est ce qu'on appelle la copie sur écriture.
Après avoir appelé pcntl_fork(), la fonction renverra deux valeurs. Renvoie l'ID de processus du processus enfant dans le processus parent et renvoie le numéro 0 à l'intérieur du processus enfant lui-même. Étant donné que plusieurs processus ne peuvent pas s'exécuter correctement dans l'environnement Apache ou FPM, vous devez exécuter le code dans l'environnement php cli.
Créer un sous-processus
La création d'un sous-processus PHP est le début de plusieurs processus, nous avons besoin de la fonction pcntl_fork()
explication détaillée de la fonction fork
— Générer une branche (processus enfant) à la position actuelle du processus actuel. Une fois que cette fonction a créé un nouveau processus enfant, le processus enfant héritera du contexte actuel du processus parent et continuera à s'exécuter vers le bas depuis la fonction pcntl_fork()
comme le processus parent, sauf que la valeur de retour de pcntl_fork()
obtenue est différente, nous pouvons donc distinguer le processus parent et le processus enfant en jugeant la valeur de retour, et le processus parent et le processus enfant peuvent être affectés à des traitements logiques différents. pcntl_fork()
instance de processus fork
processus enfant fork
$ppid = posix_getpid(); $pid = pcntl_fork(); if ($pid == -1) { throw new Exception('fork child process fail'); } elseif ($pid > 0) { cli_set_process_title("我是父 process,pid is : {$ppid}."); sleep(30); } else { $cpid = posix_getpid(); cli_set_process_title("我是 {$ppid} 子的 process,我的 process pid is : {$cpid}."); sleep(30); }
Description :
posix_getpid() : renvoie l'identifiant du processus actuelcli_set_process_title('process name') : donne un nom fort au processus actuel. En exécutant cet exemple, nous pouvons voir les deux processus PHP actuels.www@iZ2zec3dge6rwz2uw4tveuZ:~/test$ ps aux|grep -v grep |grep 我 www 18026 0.5 1.2 204068 25772 pts/0 S+ 14:08 0:00 我是父 process,pid is : 18026. www 18027 0.0 0.3 204068 6640 pts/0 S+ 14:08 0:00 我 18026 子的 process,我的 process pid is : 18027.
$pid = pcntl_fork(); if( $pid > 0 ){ echo "我是父亲".PHP_EOL; } else if( 0 == $pid ) { echo "我是儿子".PHP_EOL; } else { echo "fork失败".PHP_EOL; }
www@iZ2zec3dge6rwz2uw4tveuZ:~/test$ php 123.php 我是父亲 我是儿子
// 初始化一个 number变量 数值为1 $number = 1; $pid = pcntl_fork(); if ($pid > 0) { $number += 1; echo "我是父亲,number+1 : { $number }" . PHP_EOL; } else if (0 == $pid) { $number += 2; echo "我是儿子,number+2 : { $number }" . PHP_EOL; } else { echo "fork失败" . PHP_EOL; }
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds

En tant que langage de programmation hautement concurrent, le mécanisme de coroutine intégré et les opérations multithread de Golang permettent un multitâche léger. Cependant, dans un scénario de traitement multi-processus, la communication et la mémoire partagée entre différents processus sont devenues des enjeux clés dans le développement de programmes. Cet article présentera la méthode d'application permettant de réaliser une mémoire partagée entre plusieurs processus dans Golang. 1. Comment implémenter plusieurs processus dans Golang Dans Golang, le traitement simultané multi-processus peut être implémenté de différentes manières, notamment fork, os.Process,

Comment installer l'extension mongo dans php7.0 : 1. Créez le groupe d'utilisateurs et l'utilisateur mongodb ; 2. Téléchargez le package de code source mongodb et placez le package de code source dans le répertoire "/usr/local/src/" ; Entrez le répertoire « src/ » ; 4. Décompressez le package de code source ; 5. Créez le répertoire de fichiers mongodb ; 6. Copiez les fichiers dans le répertoire « mongodb/ » 7. Créez le fichier de configuration mongodb et modifiez la configuration.

En php5, nous pouvons utiliser la fonction fsockopen() pour détecter le port TCP. Cette fonction peut être utilisée pour ouvrir une connexion réseau et effectuer certaines communications réseau. Mais en php7, la fonction fsockopen() peut rencontrer certains problèmes, comme ne pas pouvoir ouvrir le port, ne pas pouvoir se connecter au serveur, etc. Afin de résoudre ce problème, nous pouvons utiliser la fonction socket_create() et la fonction socket_connect() pour détecter le port TCP.

Pour résoudre le problème du plugin n'affichant pas installé dans PHP 7.0 : Vérifiez la configuration du plugin et activez le plugin. Redémarrez PHP pour appliquer les modifications de configuration. Vérifiez les autorisations du fichier du plugin pour vous assurer qu'elles sont correctes. Installez les dépendances manquantes pour garantir le bon fonctionnement du plugin. Si toutes les autres étapes échouent, reconstruisez PHP. D'autres causes possibles incluent des versions de plugin incompatibles, le chargement d'une mauvaise version ou des problèmes de configuration PHP.

Tout le monde sait que Node.js est monothread, mais ils ne savent pas qu'il fournit également un module multi-thread pour accélérer le traitement de certaines tâches spéciales. Cet article vous amènera à comprendre le multi-threading de Node. js, en espérant en savoir plus. Tout le monde aide !

Golang est un multi-processus, et son modèle de thread est le modèle MPG. Dans l'ensemble, les processus Go et les threads du noyau correspondent à plusieurs à plusieurs, donc tout d'abord, ils doivent être multi-thread. Golang a un modèle dit M ratio N. N go routines peuvent être créées sous M threads. De manière générale, N est beaucoup plus grand que M. Il s'agit essentiellement d'un modèle multithread. Cependant, la planification des coroutines est déterminée par Go. runtime. Il est souligné que les développeurs doivent utiliser des canaux pour la synchronisation entre les coroutines.

Comment installer et déployer php7.0 : 1. Accédez au site officiel de PHP pour télécharger la version d'installation correspondant au système local ; 2. Extrayez le fichier zip téléchargé dans le répertoire spécifié 3. Ouvrez la fenêtre de ligne de commande et accédez à ; le répertoire "E:\php7" Exécutez simplement la commande "php -v".

Les solutions courantes pour les environnements de serveur PHP consistent à s'assurer que la version correcte de PHP est installée et que les fichiers pertinents ont été copiés dans le répertoire du module. Désactivez SELinux temporairement ou définitivement. Vérifiez et configurez PHP.ini pour vous assurer que les extensions nécessaires ont été ajoutées et configurées correctement. Démarrez ou redémarrez le service PHP-FPM. Vérifiez les paramètres DNS pour les problèmes de résolution.
