Table des matières
[转]PHP的执行流程,PHP扩展加载过程,php加载
Maison php教程 php手册 [转]PHP的执行流程,PHP扩展加载过程,php加载

[转]PHP的执行流程,PHP扩展加载过程,php加载

Jun 13, 2016 am 08:40 AM
mac

[转]PHP的执行流程,PHP扩展加载过程,php加载

原文:http://www.imsiren.com/archives/535

为了以后能开发PHP扩展..就一定要了解PHP的执行顺序..这篇文章就是为C开发PHP扩展做铺垫.
web环境 我们假设为 apache.
在编译PHP的时候,为了能够让Apache支持PHP,我们会生成一个mod_php5.so的模块.apache加载这个模块..
在url访问.php文件的时候就会转给mod_php5.so模块来处理.这个玩意是什么..就是我们常说的SAPI
英文名字是:Server abstraction API.
SAPI说的其实是一个统称,其下有 ISAPI,CLI SAPI, CGI等.
有了它,就可以很容易的跟其他东西交互.比如APACHE,IIS,CGI等.
好了回到正题.
apache启动后会将mod_pho5.so模块的hook handler注册进来.apache今天不是主角,所以不细说.
当APACHE检测到 访问的url是一个php文件时,这时候就会把控制权交给sapi.

如下图:

进入到sapi后,首先会执行sapi/apache/mod_php5.c 文件的php_init_handler函数

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 static void php_init_handler(server_rec *s, pool *p) {         register_cleanup(p, NULL, (void (*)(void *))apache_php_module_shutdown_wrapper, (void (*)(void *))php_module_shutdown_for_exec);         if (!apache_php_initialized) {                 apache_php_initialized = 1; #ifdef ZTS                 tsrm_startup(1, 1, 0, NULL); #endif                 sapi_startup(&apache_sapi_module);                 php_apache_startup(&apache_sapi_module);         } #if MODULE_MAGIC_NUMBER >= 19980527         {                 TSRMLS_FETCH();                 if (PG(expose_php)) {                         ap_add_version_component("PHP/" PHP_VERSION);                 }         } #endif }

该函数主要调用 两个函数
sapi_startup(&apache_sapi_module);
php_apache_startup(&apache_sapi_module);

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 SAPI_API void sapi_startup(sapi_module_struct *sf) {         sf->ini_entries = NULL;         sapi_module = *sf;   .................         sapi_globals_ctor(&sapi_globals); ................           virtual_cwd_startup(); /* Could use shutdown to free the main cwd but it would just slow it down for CGI */   ..................           reentrancy_startup(); }

sapi_startup创建一个 sapi_globals_struct结构体.
sapi_globals_struct保存了apache请求的基本信息,如服务器信息,header,编码等.

1 2 3 4 5 6 static void sapi_globals_ctor(sapi_globals_struct *sapi_globals TSRMLS_DC) {         memset(sapi_globals, 0, sizeof(*sapi_globals));         zend_hash_init_ex(&sapi_globals->known_post_content_types, 5, NULL, NULL, 1, 0);         php_setup_sapi_content_types(TSRMLS_C); }

known_post_content_types是一个HashTable,将其大小初始化为5.从字面意义上我猜测它保存的应该是客户端传递过来的内容类型.
php_setup_sapi_content_types函数将sapi_post_entry添加到sapi_globals里
sapi_startup执行完毕后再执行php_apache_startup

1 2 3 4 5 6 7 8 static int php_apache_startup(sapi_module_struct *sapi_module) {         if (php_module_startup(sapi_module, &apache_module_entry, 1) == FAILURE) {                 return FAILURE;         } else {                 return SUCCESS;         } }

php_module_startup 内容太多..是介绍一下作用.
1. 初始化zend_utility_functions 结构.这个结构是设置zend的函数指针,比如错误处理函数,输出函数,流操作函数等.
2. 设置环境变量.
3. 加载php.ini配置.
4. 加载php内置扩展.
5. 写日志.
6. 注册php内部函数集.
7. 调用 php_ini_register_extensions,加载所有外部扩展
8. 开启所有扩展
9. 一些清理操作.
重点说一下 3,4,7,8
加载php.ini配置
if (php_init_config(TSRMLS_C) == FAILURE) {
return FAILURE;
}
php_init_config函数会在这里检查所有php.ini配置,并且找到所有加载的模块,添加到php_extension_lists结构中.
加载php内置扩展
调用 zend_register_standard_ini_entries加载所有php的内置扩展,如array,mysql等.
调用 php_ini_register_extensions,加载所有外部扩展
main/php_ini.c

1 2 3 4 5 6 7 8 void php_ini_register_extensions(TSRMLS_D) {         zend_llist_apply(&extension_lists.engine, php_load_zend_extension_cb TSRMLS_CC);         zend_llist_apply(&extension_lists.functions, php_load_php_extension_cb TSRMLS_CC);           zend_llist_destroy(&extension_lists.engine);         zend_llist_destroy(&extension_lists.functions); }

zend_llist_apply函数遍历extension_lists 执行会掉函数 php_load_php_extension_cb
php_load_php_extension_cb

1 2 3 4 static void php_load_zend_extension_cb(void *arg TSRMLS_DC) {         zend_load_extension(*((char **) arg)); }

调用 ext/standard/dl.c zend_load_extension 加载扩展,
该函数略过..
该函数最后调用
if ((module_entry = zend_register_module_ex(module_entry TSRMLS_CC)) == NULL) {
DL_UNLOAD(handle);
return FAILURE;
}
将 扩展信息 放到 Hash表module_registry中
Zend/zend_API.c

1 2 3 4 5 if (zend_hash_add(&module_registry, lcname, name_len+1, (void *)module, sizeof(zend_module_entry), (void**)&module_ptr)==FAILURE) {                 zend_error(E_CORE_WARNING, "Module '%s' already loaded", module->name);                 efree(lcname);                 return NULL; }

最后
zend_startup_modules(TSRMLS_C); //对模块进行排序,并检测是否注册到module_registry HASH表里

zend_startup_extensions(); //执行extension->startup(extension);启动扩展…

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

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

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)

Pas de réponse lors de la saisie du mot de passe sur le clavier Mac ? Pas de réponse lors de la saisie du mot de passe sur le clavier Mac ? Feb 20, 2024 pm 01:33 PM

Introduction : Dans cet article, ce site Web vous présentera le contenu pertinent sur le clavier Mac qui ne répond pas lors de la saisie des mots de passe. J'espère que cela vous sera utile, jetons un coup d'œil. Comment résoudre le problème de l'impossibilité de saisir le mot de passe sur le système Apple Mac ? Vous pouvez également essayer de connecter ce clavier à d'autres ordinateurs pour voir s'il fonctionne normalement ? Si le même problème se produit sur un autre ordinateur, il s'agit probablement d'un problème lié au clavier lui-même. Vous pouvez envisager de remplacer le clavier ou de le réparer. La première fois que vous vous connectez à Alipay avec votre ordinateur Mac, vous trouverez l'interface de connexion et ne pourrez pas saisir votre mot de passe. Le champ de saisie du mot de passe affiche : « Veuillez cliquer ici pour installer le contrôle », la connexion Alipay nécessite donc l'installation de contrôles de sécurité. Les contrôles de sécurité peuvent crypter et protéger les informations que vous saisissez (montant, mot de passe, etc.) pour améliorer la sécurité du compte. Cravate

3 conseils pour personnaliser facilement le nom de votre ordinateur Mac, le nom d'hôte et le nom Bonjour 3 conseils pour personnaliser facilement le nom de votre ordinateur Mac, le nom d'hôte et le nom Bonjour Mar 06, 2024 pm 12:20 PM

De nombreux utilisateurs de Mac ont tendance à conserver le nom par défaut de leur appareil et n'envisageront peut-être jamais de le modifier. De nombreuses personnes choisissent de conserver le nom de la configuration initiale, comme « Johnny's MacBook Air » ou simplement « iMac ». Apprendre à changer le nom de votre Mac est une compétence très utile, surtout lorsque vous possédez plusieurs appareils, car cela peut vous aider à les distinguer et à les gérer rapidement. Ensuite, nous vous apprendrons étape par étape comment modifier le nom de l'ordinateur, le nom d'hôte et le nom Bonjour (nom d'hôte local) dans le système macOS. Pourquoi devriez-vous changer le nom de votre Mac ? Changer le nom de votre Mac peut non seulement montrer votre personnalité, mais également contribuer à améliorer l'expérience utilisateur : Personnalisez votre Mac : Le nom par défaut n'est peut-être pas à votre goût, remplacez-le par un nom que vous aimez.

Vous avez oublié votre mot de passe d'installation Mac ? Vous avez oublié votre mot de passe d'installation Mac ? Feb 20, 2024 pm 01:00 PM

Introduction : Dans cet article, ce site Web vous présentera le contenu pertinent sur l'oubli du mot de passe du programme d'installation Mac. J'espère que cela vous sera utile, jetons un coup d'œil. Que faire si vous oubliez votre mot de passe pour le logiciel d'installation de l'ordinateur Apple Tout d'abord, recherchez iCloud dans les paramètres du téléphone et cliquez pour l'ouvrir. Ensuite, entrez votre numéro de compte et votre mot de passe. Il y a une ligne de petits mots sous le bouton de connexion qui vous demande si vous avez oublié votre identifiant ou votre mot de passe. Cliquez sur cette option. Normalement, lorsque vous saisissez plusieurs fois un mot de passe incorrect sur l'interface de connexion, votre MacBook Pro vous invite à utiliser votre identifiant Apple lié pour réinitialiser votre mot de passe. Il vous suffit de suivre les étapes demandées par le système pour terminer la réinitialisation du mot de passe. 3. Éteignez d'abord votre Mac, puis redémarrez-le. Tout en appuyant sur le bouton d'alimentation, appuyez immédiatement sur com sur le clavier.

pkg à installer sur mac ? pkg à installer sur mac ? Feb 20, 2024 pm 03:21 PM

Préface : Aujourd'hui, ce site partagera avec vous le contenu pertinent sur l'installation des fichiers pkg sur Mac. Si cela peut résoudre le problème auquel vous êtes actuellement confronté, n'oubliez pas de suivre ce site et de commencer maintenant ! La version précédente de macos pkg ne peut pas être installée pour mettre à niveau le système d'exploitation : Si votre ordinateur portable utilise une ancienne version du système d'exploitation, il est recommandé de passer à la dernière version du système d'exploitation. Parce que les anciennes versions peuvent ne pas prendre en charge l'installation du dernier système macOS. Sélectionnez "Effacer" dans Utilitaire de disque, puis sélectionnez l'extension Macos dans le format, ne cochez pas l'option de cryptage et ne sélectionnez pas le format apfs, et enfin cliquez sur le bouton "Effacer" pour résoudre le problème de l'impossibilité de terminer le Installation MacOS. Faites glisser l'icône de l'application vers le fichier commençant par App

Comment tourner les pages en tapant sur Apple Mac ? Comment tourner les pages en tapant sur Apple Mac ? Feb 20, 2024 pm 12:54 PM

Introduction : Aujourd'hui, ce site partagera avec vous du contenu pertinent sur la façon de tourner les pages lors de la saisie sur Apple Mac. Si cela peut résoudre le problème auquel vous êtes actuellement confronté, n'oubliez pas de suivre ce site et de commencer maintenant ! Conseils pour utiliser le pavé tactile sur les ordinateurs portables Apple MacBook Les étapes de configuration du glissement à deux doigts sur les ordinateurs Apple sont les suivantes : Recherchez l'icône « Paramètres » sur le bureau de l'ordinateur et cliquez dessus. Sélectionnez « Pavé tactile » dans l'interface des paramètres, puis cliquez sur « Faire défiler pour zoomer ». Cochez « Direction de défilement : Naturel » dans les options de zoom de défilement pour terminer le réglage. La configuration d’une méthode de balayage à deux doigts sur votre ordinateur Apple est simple. Tout d’abord, allumez votre ordinateur et cliquez sur l’icône Paramètres en haut de l’écran. Dans l'interface des paramètres, sélectionnez l'option "Pavé tactile". Cliquez ensuite sur "Scroll Zoom" et assurez-vous que "Scroll Direction" est coché

Comment configurer WeChat Mac pour convertir automatiquement les messages vocaux en texte - Comment configurer la conversion voix en texte Comment configurer WeChat Mac pour convertir automatiquement les messages vocaux en texte - Comment configurer la conversion voix en texte Mar 19, 2024 am 08:28 AM

Récemment, certains amis ont demandé à l'éditeur comment configurer WeChat Mac pour convertir automatiquement les messages vocaux en texte ? Voici une méthode pour configurer WeChat Mac pour convertir automatiquement les messages vocaux en texte. Les amis dans le besoin peuvent venir en savoir plus. Étape 1 : Tout d’abord, ouvrez la version Mac de WeChat. Comme le montre l'image : Étape 2 : Ensuite, cliquez sur « Paramètres ». Comme le montre l'image : Étape 3 : Ensuite, cliquez sur « Général ». Comme le montre l'image : Étape 4 : Cochez ensuite l'option « Convertir automatiquement les messages vocaux du chat en texte ». Comme le montre l'image : Étape 5 : Enfin, fermez la fenêtre. Comme le montre l'image :

Mac peut-il couper des fichiers sur le disque dur ? Mac peut-il couper des fichiers sur le disque dur ? Feb 20, 2024 pm 01:00 PM

Introduction : Cet article est là pour vous présenter le contenu pertinent de la découpe de fichiers sur le disque dur sur Mac. J'espère qu'il vous sera utile, jetons un coup d'œil. Comment exporter des photos vers un disque dur mobile sur un ordinateur Mac Vous pouvez utiliser l'application Finder ou Photos pour exporter des photos vers un disque dur mobile. Lorsque vous utilisez le Finder pour exporter des photos, assurez-vous d'abord que le disque dur mobile est connecté au Mac et qu'il est reconnu avec succès par le Mac. Les étapes pour transférer des photos d'un Mac vers le disque dur sont simples : connectez d'abord le disque dur mobile à l'ordinateur, puis ouvrez l'icône [Lanceur]. Ensuite, recherchez et cliquez sur l'icône [Photos] dans la fenêtre contextuelle. Dans la fenêtre [Photos] ouverte, maintenez la touche [Shift] enfoncée

3 façons de convertir des photos HEIC en JPG sur Mac 3 façons de convertir des photos HEIC en JPG sur Mac Mar 15, 2024 pm 08:43 PM

Par défaut, l'iPhone prend les photos de l'appareil photo au format HEIC. HEIC signifie High Efficiency Image Container et peut contenir plus de données de pixels que les fichiers PNG ou JPG, occupant beaucoup moins d'espace sur le stockage de l'iPhone par rapport aux autres formats. Ces fichiers fonctionnent mieux sur les iPhones, mais ne sont pas largement acceptés sur Internet car ils donnent souvent des images floues/granuleuses lorsque vous les partagez avec des appareils non Apple. Pour vous assurer que les images HEIC sont compatibles sur d'autres appareils, vous devrez peut-être les convertir au format JPG. Cet article explique comment convertir des images HEIC en JPG sur Mac. Comment convertir des photos HEIC en JPG sur Mac [3 méthodes]

See all articles