Recommandé (gratuit) : PHP7
1. Principe
Il existe de nombreux langages de haut niveau couramment utilisés, qui peuvent être grossièrement divisés en deux types selon la manière dont ils sont exécutés : les langages compilés et les langages interprétés.
La compilation signifie « traduire » le code source du programme en langage assembleur avant que le programme source de l'application ne soit exécuté, puis le compiler davantage dans un fichier cible selon l'environnement logiciel et matériel. L'outil qui réalise le travail de compilation est généralement appelé un compilateur.
Les langues interprétées sont "traduites" en langage machine lorsque le programme est en cours d'exécution. Cependant, la « traduction » est effectuée une seule fois, de sorte que l'efficacité de l'exécution est faible. Le métier de interprète est le programme chargé de « traduire » le code source dans un langage interprété.
Pour un morceau de code en langage C, il doit être précompilé, compilé, assemblé et lié avant de pouvoir devenir un fichier binaire exécutable.
Dans les langages compilés représentés par le langage C, les mises à jour de code doivent passer par les étapes ci-dessus.
Instructions d'exécution pour les langages compilés :
La compréhension de la différence entre les langages compilés et les langages interprétés est basée sur la source Moment auquel le code est compilé en instructions pour le processeur de la plate-forme cible. Pour les langages compilés, les résultats de la compilation sont déjà des instructions pour le système CPU actuel ; pour les langages interprétés, ils doivent d'abord être compilés en code intermédiaire, puis traduits en instructions pour un système CPU spécifique via la machine virtuelle spécifique du langage interprété pour exécution. Les langues interprétées sont traduites en instructions pour la plate-forme cible pendant l'exécution. On dit souvent que les langues interprétées sont « lentes », et c’est principalement pour cela qu’elles sont lentes.
En PHP 7, le code source est d'abord analysé lexicalement et le code source est découpé en plusieurs unités de chaîne. La chaîne divisée est appelée Token. Chaque jeton indépendant ne peut pas exprimer une sémantique complète. Il doit passer par l'étape d'analyse syntaxique pour convertir le jeton en un arbre syntaxique abstrait (AST). Ensuite, l'arbre de syntaxe abstraite est converti en instructions machine pour exécution. En PHP, ces instructions sont appelées opcodes.
Étape 1 : Obtenez le jeton grâce à l'analyse lexicale du code source.
Étape 2 : Générer un arbre de syntaxe abstraite (AST) basé sur l'analyseur de syntaxe.
Étape 3 : L'arbre de syntaxe abstraite est converti en opcodes (jeu d'instructions d'opcode), et PHP interprète et exécute les opcodes.
1.Token
Le jeton est le code PHP qui est coupé en logos significatifs. PHP fournit la fonction token_get_all() pour obtenir le jeton après la coupe du code PHP.
La première valeur de chaque tableau membre du tableau bidimensionnel est la valeur d'énumération correspondant au Token. La deuxième valeur est le contenu de la chaîne d'origine correspondant au jeton. La troisième valeur est le numéro de ligne correspondant au code.
On peut voir que Token est un "morceau" un par un, mais les morceaux qui existent à eux seuls ne peuvent pas exprimer une sémantique complète, et ils doivent être organisés et connectés à l'aide de règles. L'analyseur est cet organisateur. Il vérifiera la syntaxe, fera correspondre le jeton et associera le jeton.
2.AST
AST est une nouvelle fonctionnalité de la version PHP 7. Dans les versions précédentes, il n’y avait aucune étape de génération d’AST lors de l’exécution du code PHP.
Les nœuds AST sont divisés en plusieurs types, correspondant à la syntaxe PHP.
Outil PHP-Parser, qui peut être utilisé pour visualiser l'AST généré par le code PHP.
Remarque : PHP-Parser est un outil écrit par Nikic, l'un des auteurs du noyau PHP 7, pour générer de l'AST à partir du code source PHP. Le code source est disponible sur https://github.com/nikic/PHP-Parser.
3.opcodes
l'opcode n'est qu'une seule instruction. Les opcodes sont une collection d'opcodes et constituent le code intermédiaire lors de l'exécution de PHP. Une fois l'opcode généré, il est exécuté par la machine virtuelle.
L'une des mesures d'optimisation de projet PHP les plus courantes est "activer opcache", qui fait référence au cache des opcodes ici. En éliminant l'étape allant du code source à l'opcode, le moteur peut exécuter directement l'opcode mis en cache,
améliorant ainsi les performances.
Avec le plug-in vld, vous pouvez voir intuitivement l'opcode généré par un morceau de code PHP.
opcode est un ensemble d'identifiants d'instructions définis par PHP 7, et les instructions correspondent aux gestionnaires correspondants (fonctions de traitement). Lorsque la machine virtuelle appelle l'opcode, elle trouvera la fonction de traitement derrière l'opcode et effectuera un traitement réel.
2. Architecture du noyau
Le moteur Zend contient un compilateur et un interpréteur Du code PHP à l'exécution de l'opcode, tous sont complétés par le moteur Zend.
En plus d'implémenter les fonctions de base de PHP, le moteur Zend fournit également un ensemble d'interfaces qui permettent d'utiliser PHP dans davantage de scénarios, tels que des environnements de ligne de commande, des environnements Web, etc.
Le schéma d'architecture est grossièrement divisé en quatre parties.
1) Moteur Zend : L'analyse lexicale/grammaticale, la compilation AST et l'exécution des opcodes présentées ci-dessus sont toutes implémentées dans le moteur Zend. De plus, la conception des variables PHP, la gestion de la mémoire, la gestion des processus, etc. sont également implémentées au niveau de la couche moteur. Le moteur fournit des services de base pour PHP La fiabilité et les hautes performances de PHP reposent sur le support de base du moteur. Dans le même temps, l'évolutivité du moteur Zend est l'une des raisons importantes de l'application à grande échelle de PHP.
2) Couche PHP : le moteur Zend fournit des fonctionnalités de base pour PHP (telles que l'allocation de mémoire et le recyclage), tandis que les interactions de l'extérieur doivent être gérées via la couche PHP.
3) SAPI : SAPI est l'abréviation de Server API, qui comprend le cli SAPI commun et le fpm SAPI. PHP définit les spécifications d'entrée/sortie, et la partie qui interagit avec PHP selon cette spécification peut être appelée serveur.
4) Partie extension : le moteur Zend fournit des fonctionnalités de base et des spécifications d'interface. Les extensions développées sur cette base offrent des options plus riches pour les performances et la diversité fonctionnelle du code PHP.
3. Répertoire du code source PHP
Code source du répertoire sapi
sapi directory est L'abstraction des couches d'entrée et de sortie est la spécification permettant à PHP de fournir des services externes.
L'entrée du programme PHP peut être l'entrée standard de la ligne de commande ou une requête réseau basée sur le protocole cgi/fastcgi. De la même manière, la sortie peut être écrite sur la sortie standard de la ligne de commande ou renvoyée au client sous forme de réponse réseau basée sur le protocole cgi/fastcgi.
Le mode ligne de commande correspond au programme binaire bin/php ; le mode module intégré n'a pas besoin de fournir un programme binaire, il peut être appelé comme une fonction normale par Apache ou n'importe quel programme C/C++ ; le mode CGI correspond au programme binaire Program bin/cgi ; le mode FastCGI correspond au programme binaire sbin/php-fpm.
Plusieurs SAPI couramment utilisés.
1) apache2handler : extension Apache, compilée pour générer une bibliothèque de liens dynamiques, configurée sous Apache, lorsqu'il y a une requête http vers Apache, cette bibliothèque de liens dynamiques sera appelée selon la configuration, exécuter le code PHP , et terminez l'interaction avec PHP Interaction.
2) cgi-fcgi : Après compilation, un programme exécutable prenant en charge le protocole CGI est généré. Le serveur Web (généralement Apache ou Nginx) transmet la requête au processus CGI via le protocole CGI, et le code d'exécution. renvoie le résultat au serveur Web et quitte le processus.
3) fpm-fcgi : fpm signifie FastCGI Process Manager, le gestionnaire de processus FastCGI officiellement fourni par PHP. En prenant le serveur Nginx comme exemple, lorsqu'une requête de protocole http est envoyée au serveur Nginx, Nginx transmet la requête au processus php-fpm pour traitement selon le protocole FastCGI.
4) cli : abréviation de Command Line Interface, l'interface interactive en ligne de commande de PHP.
Code source du répertoire Zend
Le répertoire Zend est le code principal de PHP.
1. Module de gestion de la mémoire
2. Collecte des déchets
3. Implémentation du tableau
Code source du répertoire principal
Le répertoire principal est le ciment entre la couche SAPI et la couche Zend.
La couche Zend implémente la compilation et l'exécution des scripts PHP, la couche sapi implémente l'abstraction des entrées et sorties, et le répertoire principal sert de lien entre le précédent et le suivant : analyser la requête SAPI et analyser le fichier de script à exécuter et les paramètres lorsqu'ils sont activés, effectuer l'initialisation nécessaire et les autres travaux avant d'appeler le moteur Zend.
Code source du répertoire ext
ext est un répertoire lié aux extensions PHP couramment utilisées, str, pdo et d'autres séries de fonctions sont définies ici.
Code source du répertoire TSRM
Au début, PHP était principalement exécuté dans un seul processus et un modèle à thread unique. Ce n'est que plus tard que le. le mécanisme de sécurité des threads ZTS (Zend Thread Safety) a été introduit).
TSRM est l'abréviation de Thread Safe Resource Manager - Thread Safe Resource Manager.
Le mécanisme de sécurité des threads vise principalement à assurer la sécurité des ressources partagées. Le mécanisme de sécurité des threads de PHP est simple et intuitif : dans un environnement multithread, chaque thread reçoit une copie indépendante des variables globales. L'implémentation spécifique consiste à allouer (verrouiller avant allocation) un ID indépendant (auto-incrémentation) à chaque thread via TSRM en tant qu'index de zone mémoire variable globale du thread actuel. Dans le futur accès aux variables globales, une indépendance complète entre les threads est obtenue.
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!