Table des matières
PHP内核两大流程之请求处理
Maison développement back-end tutoriel php PHP内核两大流程之请求处理_PHP教程

PHP内核两大流程之请求处理_PHP教程

Jul 13, 2016 am 10:13 AM
Noyau

PHP内核两大流程之请求处理

static int php_handler(request_rec *r)
{
	/* Initiliaze the context */
        php_struct * volatile ctx;
        void *conf;
        apr_bucket_brigade * volatile brigade;
        apr_bucket *bucket;
        apr_status_t rv;
        request_rec * volatile parent_req = NULL;
        TSRMLS_FETCH();

	......

        zend_file_handle zfd;

        zfd.type = ZEND_HANDLE_FILENAME;
        zfd.filename = (char *) r->filename;
        zfd.free_filename = 0;
        zfd.opened_path = NULL;

	zend_execute_scripts(ZEND_INCLUDE TSRMLS_CC, NULL, 1, &zfd);

	......
}

ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_count, ...) /* {{{ */
{
	......

	EG(active_op_array) = \
	zend_compile_file(file_handle, type TSRMLS_CC);

	......

	zend_execute(EG(active_op_array) TSRMLS_CC);

	......
}

ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)  
{  
    // 初始化执行上下文  
    zend_execute_data execute_data;  
  
    // 如果有异常就退出执行  
    if (EG(exception)) {  
        return;  
    }  
  
    /* Initialize execute_data */  
    EX(fbc) = NULL; // 初始化正在调用的函数  
    EX(object) = NULL; // 初始化正在调用的对象  
    EX(old_error_reporting) = NULL; // 初始化错误报告变量  
      
    // 为执行栈分配空间  
&#160; &#160; if (op_array->T < TEMP_VAR_STACK_LIMIT) { &#160;
&#160; &#160; &#160; &#160; EX(Ts) = (temp_variable *) do_alloca(sizeof(temp_variable) * op_array->T); &#160;
&#160; &#160; } else { &#160;
&#160; &#160; &#160; &#160; EX(Ts) = (temp_variable *) safe_emalloc(sizeof(temp_variable), op_array->T, 0); &#160;
&#160; &#160; } &#160;
&#160; &#160; // 为临时变量分配空间并初始化这些空间 &#160;
&#160; &#160; EX(CVs) = (zval***)do_alloca(sizeof(zval**) * op_array->last_var); &#160;
&#160; &#160; memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var); &#160;
&#160; &#160; &#160;&#160;
&#160; &#160; EX(op_array) = op_array; &#160;
&#160; &#160; &#160;&#160;
&#160; &#160; // 切换执行上下文 &#160;
&#160; &#160; EX(original_in_execution) = EG(in_execution); &#160;
&#160; &#160; EX(symbol_table) = EG(active_symbol_table); &#160;
&#160; &#160; EX(prev_execute_data) = EG(current_execute_data); // 将当前全局变量中的执行数据压栈 &#160;
&#160; &#160; EG(current_execute_data) = &execute_data; // 将当前执行上下文压栈 &#160;
&#160;&#160;
&#160; &#160; EG(in_execution) = 1; &#160;
&#160; &#160; // 初始化第一个指令(opcode) &#160;
&#160; &#160; /*&#160;
&#160; &#160; #define ZEND_VM_SET_OPCODE(new_op) \&#160;
&#160; &#160; CHECK_SYMBOL_TABLES() \&#160;
&#160; &#160; EX(opline) = new_op&#160;
&#160; &#160; &#160;
&#160; &#160; execute_data.opline 为当前执行的 opcode&#160;
&#160; &#160; */ &#160;
&#160; &#160; if (op_array->start_op) { &#160;
&#160; &#160; &#160; &#160; ZEND_VM_SET_OPCODE(op_array->start_op); &#160;
&#160; &#160; } else { &#160;
&#160; &#160; &#160; &#160; ZEND_VM_SET_OPCODE(op_array->opcodes); &#160;
&#160; &#160; } &#160;
&#160;&#160;
&#160; &#160; if (op_array->uses_this && EG(This)) { &#160;
&#160; &#160; &#160; &#160; EG(This)->refcount++; /* For $this pointer */ &#160;
&#160; &#160; &#160; &#160; if (zend_hash_add(EG(active_symbol_table), "this", sizeof("this"), &EG(This), sizeof(zval *), NULL)==FAILURE) { &#160;
&#160; &#160; &#160; &#160; &#160; &#160; EG(This)->refcount--; &#160;
&#160; &#160; &#160; &#160; } &#160;
&#160; &#160; } &#160;
&#160;&#160;
&#160; &#160; // 将存储opline的内存地址赋给 executor_globals.online_ptr ,可以实时跟踪opcode的执行 &#160;
&#160; &#160; EG(opline_ptr) = &EX(opline); &#160;
&#160;&#160;
&#160; &#160; EX(function_state).function = (zend_function *) op_array; &#160;
&#160; &#160; EG(function_state_ptr) = &EX(function_state); &#160;
#if ZEND_DEBUG &#160;
&#160; &#160; /* function_state.function_symbol_table is saved as-is to a stack,&#160;
&#160; &#160; &#160;* which is an intentional UMR. &#160;Shut it up if we&#39;re in DEBUG.&#160;
&#160; &#160; &#160;*/ &#160;
&#160; &#160; EX(function_state).function_symbol_table = NULL; &#160;
#endif &#160;
&#160; &#160; &#160;&#160;
&#160; &#160; while (1) { &#160;
#ifdef ZEND_WIN32 &#160;
&#160; &#160; &#160; &#160; if (EG(timed_out)) { &#160;
&#160; &#160; &#160; &#160; &#160; &#160; zend_timeout(0); &#160;
&#160; &#160; &#160; &#160; } &#160;
#endif &#160;
&#160; &#160; &#160; &#160; &#160;&#160;
&#160; &#160; &#160; &#160; // 循环调用每个opline的 handler 函数,如果是推出函数的话,返回值大于0,就退出 &#160;
&#160; &#160; &#160; &#160; if (EX(opline)->handler(&execute_data TSRMLS_CC) > 0) { &#160;
&#160; &#160; &#160; return; &#160;
&#160; &#160; &#160; &#160; } &#160;
&#160;&#160;
&#160; &#160; } &#160;
&#160; &#160; zend_error_noreturn(E_ERROR, "Arrived at end of main loop which shouldn&#39;t happen"); &#160;
} &#160;
Copier après la connexion

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/914780.htmlTechArticlePHP内核两大流程之请求处理 static int php_handler(request_rec *r){/* Initiliaze the context */ php_struct * volatile ctx; void *conf; apr_bucket_brigade * volatile brigad...
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

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 !

Outils chauds

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)

Comment installer le noyau Linux sur Ubuntu 22.04 Tutoriel détaillé ! Comment installer le noyau Linux sur Ubuntu 22.04 Tutoriel détaillé ! Mar 01, 2024 pm 10:34 PM

Pour installer le noyau Linux sur Ubuntu22.04, vous pouvez suivre les étapes suivantes : Mettre à jour le système : Tout d'abord, assurez-vous que votre système Ubuntu est le dernier, exécutez la commande suivante pour mettre à jour le package système : sudoaptupdatesudoaptupgrade Téléchargez le fichier du noyau : Visitez le Site Web officiel du noyau Linux () pour télécharger la version requise du noyau. Sélectionnez une version stable et téléchargez le fichier de code source (avec l'extension .tar.gz ou .tar.xz), par exemple : wget Décompressez le fichier : Utilisez la commande suivante pour décompresser le fichier de code source du noyau téléchargé : tar-xflinux-5.14 .tar.xz install build dependencies : installez les outils et les dépendances requis pour construire le noyau. Exécuter

Modifier la séquence de démarrage du noyau Linux Modifier la séquence de démarrage du noyau Linux Feb 23, 2024 pm 10:22 PM

Modifier la séquence de démarrage du noyau de Linux 1. Modifiez la séquence de démarrage du noyau de RHEL6/CentOS6 Vérifiez le fichier /etc/grub.conf pour déterminer la situation du noyau du système. Selon le document, il existe deux versions de noyau dans le système, à savoir 2.6.32-573.18.1.el6.x86_64 et 2.6.32-431.23.3.el6.x86_64. Les versions du noyau sont répertoriées de haut en bas. Dans le fichier grub.conf, vous pouvez décider quelle version du noyau utiliser au démarrage du système en ajustant les paramètres par défaut. La valeur par défaut est 0, ce qui signifie que le système démarrera la dernière version du noyau. Une valeur de 0 correspond au premier contenu répertorié dans le fichier grub.conf.

Le système Android est-il basé sur le noyau Linux ? Le système Android est-il basé sur le noyau Linux ? Mar 14, 2024 pm 03:12 PM

Le système Android est-il basé sur le noyau Linux ? Le système Android, l'un des systèmes d'exploitation mobiles les plus utilisés au monde, a toujours été considéré comme développé sur la base du noyau Linux. Mais quelle est la situation réelle ? Explorons cette question. Commençons par découvrir le noyau Linux. Le noyau Linux, en tant que noyau de système d'exploitation open source, a été publié pour la première fois par Linus Torvalds en 1991. Il constitue une bonne base pour de nombreux systèmes d'exploitation, notamment And

Analyse et analyse des fonctions principales du noyau Linux Analyse et analyse des fonctions principales du noyau Linux Mar 14, 2024 am 11:27 AM

Analyse et analyse des fonctions principales du noyau Linux Le noyau Linux est un système vaste et complexe, dans lequel la fonction principale joue un rôle essentiel. Elle est le point d'entrée de l'ensemble du système et est responsable de l'initialisation de divers sous-systèmes, pilotes et modules du noyau. démarrez tout le système d’exploitation. Cet article analysera et analysera la fonction principale du noyau Linux, et démontrera ses fonctions clés et son flux d'exécution à travers des exemples de code spécifiques. Dans le noyau Linux, le point d'entrée de la fonction main est start_k dans le fichier init/main.c.

Explorez les langages de programmation utilisés sous le capot du noyau Linux Explorez les langages de programmation utilisés sous le capot du noyau Linux Mar 20, 2024 am 08:06 AM

Titre : Exploration du langage de programmation utilisé à la base du noyau Linux En tant que noyau de système d'exploitation open source, stable et fiable, le noyau Linux possède un large éventail d'applications dans le domaine informatique. Pour avoir une compréhension approfondie du noyau Linux, vous devez impliquer le langage de programmation utilisé à son niveau sous-jacent. En fait, le noyau Linux est principalement écrit en langage C, qui est un langage de programmation efficace, flexible et facile à maintenir, très adapté au développement de systèmes d'exploitation. Cet article explorera le bas du noyau Linux d'un point de vue détaillé

Explication détaillée de l'emplacement de stockage du code source du noyau Linux Explication détaillée de l'emplacement de stockage du code source du noyau Linux Mar 14, 2024 pm 06:12 PM

Explication détaillée de l'emplacement de stockage du code source du noyau Linux Le code source du noyau Linux est la partie essentielle du système d'exploitation Linux. Il contient le code d'implémentation de diverses fonctions du système d'exploitation. Pour comprendre où est stocké le code source du noyau Linux, nous devons d’abord comprendre la structure organisationnelle du noyau Linux. Le code source du noyau Linux est généralement stocké dans le répertoire /usr/src/linux ou /usr/src/linux-. Dans ce répertoire, il y a beaucoup

Tutoriel de compilation et d'installation du noyau Ubuntu. Tutoriel de compilation et d'installation du noyau Ubuntu. Feb 19, 2024 pm 02:54 PM

La compilation et l'installation du noyau Ubuntu nécessitent certaines compétences professionnelles et une expérience pratique. Voici les étapes générales, mais veuillez procéder avec prudence car ce processus peut comporter certains risques. Avant de commencer, assurez-vous de sauvegarder les données et les systèmes importants. Obtenez le code source : visitez le site Web officiel d'Ubuntu () ou le site Web des développeurs du noyau () pour télécharger le dernier code source du noyau. Décompressez le code source dans un répertoire approprié, tel que /usr/src. Installer les dépendances de compilation : installez les dépendances requises pour construire le noyau. Ouvrez un terminal et exécutez la commande suivante : sudoapt-getinstallbuild-essentiallibncurses-devbisonflexlibssl-devlibelf-d

Les performances de Win10 sont-elles améliorées par rapport à Win7 ? Les performances de Win10 sont-elles améliorées par rapport à Win7 ? Dec 23, 2023 am 09:04 AM

Le système le plus populaire est désormais le système Win10. Bien sûr, il y a aussi des utilisateurs qui se préparent à effectuer une mise à niveau. Ce qui préoccupe le plus ces utilisateurs, c'est de savoir si les performances de Win10 sont améliorées par rapport à Win7 ? En fait, dans l’ensemble, il y a encore quelques améliorations et la compatibilité est également bonne. Les performances de Win10 sont-elles améliorées par rapport à Win7 ? Réponse : Les performances de Win10 sont améliorées par rapport à Win7. L'amélioration globale n'est pas très grande, car les performances sont principalement liées au matériel. Cependant, le système Win10 a subi de nombreuses optimisations afin de pouvoir fournir une meilleure assistance. De plus, Microsoft ne prend plus en charge les mises à jour Win7, Win10 sera donc le système le plus courant à l'avenir. Caractéristiques comparatives de win10 par rapport à win7 : 1. Configuration : win7 est lancé depuis plus de dix ans et a traversé beaucoup de choses.

See all articles