La colonne suivante du tutoriel d'utilisation de Workerman vous présentera plusieurs concepts que vous devez connaître sur Workerman. J'espère qu'il sera utile à vos amis dans le besoin !
Workerman est un framework de service de socket PHP open source et hautes performances développé uniquement en PHP. Il ne s'agit pas d'un framework MVC, mais d'un framework de services socket de niveau inférieur et plus général. Vous pouvez l'utiliser pour développer des agents TCP, des agents à relais, des serveurs de jeux, des serveurs de messagerie et des serveurs FTP.
Recommandé : Tutoriel Workerman
En fait, Workerman est similaire à une version PHP de nginx, et le noyau est également multi-processus + Epoll + IO non bloquant . Chaque processus Workerman peut maintenir des dizaines de milliers de connexions simultanées. Parce qu'il réside en mémoire, il ne repose pas sur des conteneurs tels qu'Apache, nginx et php-fpm et offre des performances ultra élevées.
Prend en charge TCP, UDP, UNIXSOCKET en même temps, prend en charge les connexions longues, prend en charge Websocket, HTTP, WSS, HTTPS et d'autres protocoles de communication ainsi que divers protocoles personnalisés. Il comporte de nombreux composants hautes performances tels que des minuteries, des clients socket asynchrones, Mysql asynchrone, Redis asynchrone, HTTP asynchrone et des files d'attente de messages asynchrones.
Tout d'abord, vous devez comprendre quelques concepts de base, 1. Multi-processus 2. Epoll 3. IO non bloquantes
1. Multi-processus :
Tout d'abord, qu'est-ce qu'un processus ? Un processus comprend du code, des données et des ressources (mémoire) allouées au processus. Intuitivement, un processus est un PID dans un système informatique. . Le système d'exploitation protège l'espace des processus des interférences des processus externes, c'est-à-dire qu'un processus ne peut pas accéder à la mémoire d'un autre processus.
Parfois, il est nécessaire de communiquer entre les processus. Dans ce cas, le système d'exploitation peut être utilisé pour fournir un mécanisme de communication inter-processus. Normalement, lorsque vous exécutez un fichier exécutable, le système d'exploitation crée un processus pour qu'il s'exécute. Mais si le fichier d'exécution est basé sur une conception multi-processus, le système d'exploitation créera plusieurs processus sur le processus d'origine. Le code exécuté entre ces processus est le même, mais les résultats de l'exécution peuvent être les mêmes. .C'est peut-être différent.Pourquoi avons-nous besoin de plusieurs processus ? L'idée la plus intuitive est que si le système d'exploitation prend en charge le multicœur, alors un fichier exécutable peut s'exécuter sur différents cœurs même s'il n'est pas multicœur, pendant qu'un processus attend des opérations d'E/S, un autre ; Le processus peut également s'exécuter sur le processeur. Exécutez-le pour améliorer l'utilisation du processeur et l'efficacité du programme.
Sur les systèmes Linux, vous pouvez utiliser fork() pour créer un processus enfant dans le processus parent. Après qu'un processus ait appelé fork(), le système allouera d'abord des ressources au nouveau processus, telles que les données de stockage et l'espace de code. Ensuite, toutes les valeurs et l'état du processus d'origine sont copiés dans le nouveau processus. Seules quelques valeurs sont différentes du processus d'origine pour distinguer les différents processus. La fonction fork() reviendra deux fois, une fois au processus parent (renvoyant le pid du processus enfant ou les informations d'échec du fork) et une fois au processus enfant (renvoyant 0). À ce stade, les deux processus se sont séparés et chacun s’est exécuté dans le système.2. IO non bloquantes :
Tout d'abord, qu'est-ce que l'IO, c'est-à-dire le fonctionnement de l'entrée et de la sortie. L'essence du réseau IO est la lecture du socket. Socket est abstrait comme un flux dans le système Linux, et IO peut être compris comme une opération de convection. Pour un accès IO (prenons la lecture comme exemple), les données seront d'abord copiées dans le tampon du noyau du système d'exploitation, puis copiées du tampon du noyau du système d'exploitation vers l'espace d'adressage du programme d'application. Ainsi, lorsqu'une opération de lecture se produit, elle passera par deux étapes : La première étape (attente des données) : En attente que les données soient prêtes (En attente que les données soient prêtes prêt). La deuxième étape (copie des données) : Copie des données du noyau vers le processus (Copie des données du noyau vers le processus)Pour le flux de socket (c'est-à-dire IO),Étape 1 : implique généralement d'attendre qu'un paquet de données arrive sur le réseau, puis soit copié dans un tampon du noyau. Étape 2 : Copiez les données du tampon du noyau vers le tampon du processus d'application.Les modèles d'IO réseau sont à peu près les suivants :
IO synchrone)
Blocage d'IO (blocage d'IO) IO ) la ressource est indisponible, la requête IO est bloquée jusqu'au résultat du retour (données ou timeout). Sous Linux, toutes les sockets sont bloquées par défaut. La caractéristique du blocage des IO est qu'elles sont bloquées dans les deux étapes de l'exécution des IO (attente des données et copie des données). Lorsque les ressources IO non bloquantes (IO non bloquantes) ne sont pas disponibles, la requête IO part et revient, et les données de retour indiquent que la ressource n'est pas disponible. Sous Linux, si les données ne sont pas prêtes, elles ne bloqueront pas le processus utilisateur et le noyau reviendra immédiatement au processus, indiquant que cette commande ne peut pas être satisfaite immédiatement (EAGAIN ou EWOULDBLOCK). Par conséquent, le non-blocage est obtenu grâce à l'interrogation. Multiplexage IO (multiplexage IO) Le multiplexage IO est ce que nous appelons select, poll et epoll. Dans certains endroits, cette méthode IO est également appelée IO pilotée par événement. L'avantage de select/epoll est qu'un seul processus peut gérer les E/S de plusieurs connexions réseau en même temps.Son principe de base est que les fonctions select, poll et epoll interrogeront en permanence toutes les sockets dont elles sont responsables. Lorsque les données arrivent dans une certaine socket, le processus utilisateur en sera informé. Dans le modèle de multiplexage IO, en pratique, chaque socket est généralement réglé sur non bloquant.
Cependant, l’ensemble du processus utilisateur est en réalité bloqué en permanence. C'est juste que le processus est bloqué par la fonction select au lieu d'être bloqué par le socket IO. Par conséquent, le multiplexage des E/S est bloqué sur les appels système tels que select et epoll, mais pas sur les appels système d'E/S réels tels que recvfrom.
IO pilotée par signal (IO pilotée par signal)
IO asynchrone (IO asynchrone) Une fois que le processus utilisateur a lancé l'opération de lecture, il peut immédiatement commencer à faire autre chose . D'un autre côté, du point de vue du noyau, lorsqu'il reçoit une lecture asynchrone, elle reviendra immédiatement, cela ne provoquera donc aucun blocage du processus utilisateur.
Ensuite, le noyau attendra que la préparation des données soit terminée, puis copiera les données dans la mémoire utilisateur. Lorsque tout cela sera terminé, le noyau enverra un signal au processus utilisateur pour lui dire que. l'opération de lecture est terminée.
3. Epoll : epoll est facile à comprendre maintenant. epoll est un sondage amélioré réalisé par le noyau Linux pour gérer de gros lots de descripteurs de fichiers. version améliorée de l'interface select/poll, qui peut améliorer considérablement l'utilisation du processeur système du programme lorsque seul un petit nombre de connexions actives sont actives parmi un grand nombre de connexions simultanées.
PS. Plusieurs points à noter :
1 : Le multiplexage des E/S est-il un modèle de blocage synchrone ou un modèle de blocage asynchrone ?
La synchronisation nécessite d'attendre activement les notifications de messages, tandis que l'asynchrone nécessite de recevoir passivement des notifications de messages et d'obtenir passivement des messages via des rappels, des notifications, un statut, etc. Lorsque le multiplexage IO bloque l'étape de sélection, le processus utilisateur attend activement et appelle la fonction de sélection pour obtenir le message d'état de données prêtes, et son état de processus est bloqué. Par conséquent, le multiplexage IO est classé comme mode de blocage synchrone.
2 : Qu'est-ce que la simultanéité élevée ?
Les programmes hautement concurrents utilisent généralement la méthode synchrone non bloquante plutôt que la méthode multi-threading + blocage synchrone. Pour comprendre cela, regardez d’abord la différence entre la concurrence et le parallélisme. C'est-à-dire que le nombre de concurrence fait référence au nombre de tâches exécutées en même temps (comme les requêtes HTTP traitées en même temps), tandis que le nombre de parallélisme est le nombre de ressources physiques pouvant fonctionner simultanément ( comme le nombre de cœurs de processeur).
En planifiant correctement les différentes étapes des tâches, le nombre de simultanéités peut être bien supérieur au degré de parallélisme. C'est le secret pour lequel quelques processeurs peuvent prendre en charge des dizaines de milliers de requêtes simultanées d'utilisateurs. Dans cette situation de forte concurrence, la création d’un processus ou d’un thread pour chaque tâche (demande de l’utilisateur) coûte très cher. La méthode synchrone non bloquante peut lancer plusieurs requêtes IO en arrière-plan, ce qui peut servir un grand nombre de requêtes IO simultanées en un seul processus.
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!