Maison > Article > développement back-end > Analyse du noyau PHP7 7 Processus d'exécution du moteur Zend
Le contenu de cet article présente le processus d'exécution du moteur Zend de PHP7 Kernel Analysis 7. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer
1.EG(executor_globals/zend_executor_globals. )
La structure la plus importante dans tout le cycle de vie de PHP est une variable globale, qui est allouée avant l'exécution principale (pas sous ZTS, jusqu'à la sortie de PHP, elle enregistre toutes les informations du courant). demande
2.EX(execute_data/zend_execute_data)
dans La structure de base du processus d'exécution. Chaque appel de fonction, include/require, eval, etc. générera une nouvelle structure, qui représente la portée actuelle, la position d'exécution du code, l'allocation des variables locales, etc.,
#define EX(element) ((execute_data)->element) struct _zend_execute_data { const zend_op *opline; //指向当前执行的opcode,初始时指向zend_op_array起始位置 zend_execute_data *call; /* current call */ zval *return_value; //返回值指针 zend_function *func; //当前执行的函数(非函数调用时为空) zval This; //这个值并不仅仅是面向对象的this,还有另外两个值也通过这个记录:call_info + num_args,分别存在zval.u1.reserved、zval.u2.num_args zend_class_entry *called_scope; //当前call的类 zend_execute_data *prev_execute_data; //函数调用时指向调用位置作用空间 zend_array *symbol_table; //全局变量符号表 #if ZEND_EX_USE_RUN_TIME_CACHE void **run_time_cache; /* cache op_array->run_time_cache */ #endif #if ZEND_EX_USE_LITERALS zval *literals; //字面量数组,与func.op_array->literals相同 #endif };
3. Processus d'exécution Zend
Dans Zend zend_execute_data. opline et zend_execute_data.prev_execute_data de zend_execute_data dans la VM implémentent call/ret
step1: 为当前作用域分配一块内存,充当运行栈,zend_execute_data结构、所有局部变量、中间变量等等都在此内存上分配 step2: 初始化全局变量符号表,然后将全局执行位置指针EG(current_execute_data)指向step1新分配的zend_execute_data,然后将zend_execute_data.opline指向op_array的起始位置 step3: 从EX(opline)开始调用各opcode的C处理handler(即_zend_op.handler),每执行完一条opcode将EX(opline)++继续执行下一条,直到执行完全部opcode,函数/类成员方法调用、if的执行过程: step3.1: if语句将根据条件的成立与否决定EX(opline) + offset所加的偏移量,实现跳转 step3.2: 如果是函数调用,则首先从EG(function_table)中根据function_name取出此function对应的编译完成的zend_op_array,然后像step1一样新分配一个zend_execute_data结构, 将EG(current_execute_data)赋值给新结构的prev_execute_data,再将EG(current_execute_data)指向新的zend_execute_data,最后从新的zend_execute_data.opline开始执行,切换 到函数内部,函数执行完以后将EG(current_execute_data)重新指向EX(prev_execute_data),释放分配的运行栈,销毁局部变量,继续从原来函数调用的位置执行 step4: 全部opcode执行完成后将step1分配的内存释放,这个过程会将所有的局部变量"销毁",执行阶段结束
4 . Mise en cache d'exécution
Pendant l'exécution, PHP a souvent besoin de rechercher des constantes, des fonctions, des classes, des méthodes membres, des attributs de membre, etc. dans différentes tables de hachage en fonction de leurs noms, PHP fournit donc un mécanisme de mise en cache. est développé pour mettre en cache les résultats trouvés en fonction du nom, de sorte que lorsque le même opcode est à nouveau exécuté, la dernière valeur mise en cache puisse être directement réutilisée sans recherches répétées, améliorant ainsi l'efficacité de l'exécution. Le mécanisme de cache d'exécution ne prendra effet que lorsque le même opcode est exécuté plusieurs fois. Veuillez noter que le même opcode ici ne fait pas référence à la même valeur d'opcode, mais aux mêmes données dans la mémoireEn fait, le cache d'exécution est. Il est stocké en fonction de l'opérande CONST dans l'opcode auquel il appartient. C'est-à-dire que seuls les opérandes contenant le type IS_CONST peuvent utiliser ce mécanisme, et les autres types ne seront pas utilisés. En effet, seul l'opérande CONST est fixe. les autres types ne sont pas utilisés. CV, VAR et autres types de valeurs ne sont pas fixes Puisque leurs valeurs ne sont pas fixes, les valeurs mises en cache ne sont pas fixes, donc les opérations d'opcode de types autres que CONST ne seront pas mises en cache.
connexes Recommandés :
Analyse du noyau PHP7 6 fonctions
Analyse du noyau PHP7 5 Compilation de code PHP
Analyse du noyau PHP7 4 variables locales, variables globales, constantes
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!