Inhaltsverzeichnis
[转]PHP的执行流程,PHP扩展加载过程,php加载
Heim 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);启动扩展…

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Keine Reaktion bei Passworteingabe auf der Mac-Tastatur? Keine Reaktion bei Passworteingabe auf der Mac-Tastatur? Feb 20, 2024 pm 01:33 PM

Einleitung: In diesem Artikel stellt Ihnen diese Website die relevanten Inhalte zum Thema „Nicht reagierende Mac-Tastatur bei der Eingabe von Passwörtern“ vor. Ich hoffe, dass er für Sie hilfreich ist. Werfen wir einen Blick darauf. Wie lässt sich das Problem lösen, dass das Passwort auf dem Apple Mac-System nicht eingegeben werden kann? Sie können auch versuchen, diese Tastatur an andere Computer anzuschließen, um zu sehen, ob sie normal funktioniert. Wenn das gleiche Problem auf einem anderen Computer auftritt, liegt höchstwahrscheinlich ein Fehler an der Tastatur selbst vor. Sie können darüber nachdenken, die Tastatur auszutauschen oder zu reparieren. Wenn Sie sich mit Ihrem Mac-Computer zum ersten Mal bei Alipay anmelden, finden Sie die Anmeldeschnittstelle vor und können Ihr Passwort nicht eingeben. Im Passwort-Eingabefeld wird angezeigt: „Bitte klicken Sie hier, um die Steuerung zu installieren“, daher erfordert die Alipay-Anmeldung die Installation von Sicherheitskontrollen. Sicherheitskontrollen können die von Ihnen eingegebenen Informationen (Betrag, Passwort usw.) verschlüsseln und schützen, um die Kontosicherheit zu verbessern. Binden

3 Tipps zum einfachen Anpassen Ihres Mac-Computernamens, Hostnamens und Bonjour-Namens 3 Tipps zum einfachen Anpassen Ihres Mac-Computernamens, Hostnamens und Bonjour-Namens Mar 06, 2024 pm 12:20 PM

Viele Mac-Benutzer neigen dazu, den Standardnamen ihres Geräts beizubehalten und denken möglicherweise nie darüber nach, ihn zu ändern. Viele Leute entscheiden sich dafür, den Namen aus der Ersteinrichtung beizubehalten, beispielsweise „Johnnys MacBook Air“ oder einfach „iMac“. Zu lernen, wie Sie den Namen Ihres Mac ändern, ist eine sehr nützliche Fähigkeit, insbesondere wenn Sie über mehrere Geräte verfügen, da Sie diese schnell unterscheiden und verwalten können. Als Nächstes zeigen wir Ihnen Schritt für Schritt, wie Sie den Computernamen, den Hostnamen und den Bonjour-Namen (lokaler Hostname) im macOS-System ändern. Warum sollten Sie Ihren Mac-Namen ändern? Das Ändern des Namens Ihres Mac kann nicht nur Ihre Persönlichkeit zeigen, sondern auch dazu beitragen, das Benutzererlebnis zu verbessern: Personalisieren Sie Ihren Mac: Der Standardname entspricht möglicherweise nicht Ihrem Geschmack. Ändern Sie ihn in einen Namen, der Ihnen gefällt.

Haben Sie Ihr Mac-Installer-Passwort vergessen? Haben Sie Ihr Mac-Installer-Passwort vergessen? Feb 20, 2024 pm 01:00 PM

Einleitung: In diesem Artikel stellt Ihnen diese Website die relevanten Inhalte zum Thema „Passwort vergessen“ des Mac-Installationsprogramms vor. Ich hoffe, dass er Ihnen hilfreich sein wird. Werfen wir einen Blick darauf. Was tun, wenn Sie Ihr Passwort für die Apple-Computerinstallationssoftware vergessen? Suchen Sie zunächst in den Telefoneinstellungen nach iCloud und klicken Sie, um es zu öffnen. Geben Sie als Nächstes Ihre Kontonummer und Ihr Passwort ein. Unterhalb der Anmeldeschaltfläche befindet sich eine Zeile mit kleinen Wörtern, die Sie darauf hinweist, wenn Sie Ihre ID oder Ihr Passwort vergessen haben. Klicken Sie auf diese Option. Nachdem Sie auf der Anmeldeoberfläche mehrmals ein falsches Passwort eingegeben haben, werden Sie normalerweise von Ihrem MacBook Pro aufgefordert, Ihre gebundene Apple-ID zum Zurücksetzen Ihres Passworts zu verwenden. Sie müssen lediglich den vom System angezeigten Schritten folgen, um das Zurücksetzen des Passworts abzuschließen. 3. Fahren Sie Ihren Mac zunächst herunter und starten Sie ihn dann neu. Halten Sie dabei sofort die Taste „com“ auf der Tastatur gedrückt.

pkg-Datei auf dem Mac installieren? pkg-Datei auf dem Mac installieren? Feb 20, 2024 pm 03:21 PM

Vorwort: Heute stellt Ihnen diese Website relevante Inhalte zur Installation von PKG-Dateien auf dem Mac vor. Vergessen Sie nicht, dieser Website zu folgen und jetzt damit zu beginnen! Die vorherige Version von macos pkg kann nicht zum Aktualisieren des Betriebssystems installiert werden: Wenn Ihr Laptop eine ältere Betriebssystemversion verwendet, wird empfohlen, ein Upgrade auf die neueste Betriebssystemversion durchzuführen. Denn ältere Versionen unterstützen möglicherweise nicht die Installation des neuesten macOS-Systems. Wählen Sie im Festplatten-Dienstprogramm „Löschen“, wählen Sie dann die MacOS-Erweiterung im Format aus, aktivieren Sie nicht die Verschlüsselungsoption und wählen Sie nicht das APFS-Format aus und klicken Sie schließlich auf die Schaltfläche „Löschen“, um das Problem zu lösen, dass der Vorgang nicht abgeschlossen werden kann macOS-Installation. Ziehen Sie das Symbol der Anwendung in die Datei, die mit „App“ beginnt

Wie blättere ich beim Tippen auf dem Apple Mac um? Wie blättere ich beim Tippen auf dem Apple Mac um? Feb 20, 2024 pm 12:54 PM

Einleitung: Heute stellt Ihnen diese Website relevante Inhalte zum Umblättern beim Tippen auf dem Apple Mac vor. Wenn das Problem, mit dem Sie jetzt konfrontiert sind, dadurch gelöst werden kann, vergessen Sie nicht, dieser Website Aufmerksamkeit zu schenken und jetzt damit zu beginnen! Tipps zur Verwendung des Touchpads auf Apple MacBook-Laptops: Gehen Sie wie folgt vor, um das Zwei-Finger-Sliding auf Apple-Computern einzurichten: Suchen Sie das Symbol „Einstellungen“ auf dem Computer-Desktop und klicken Sie darauf. Wählen Sie in der Einstellungsoberfläche „Touchpad“ und klicken Sie dann auf „Zum Zoomen scrollen“. Aktivieren Sie „Scrollrichtung: Natürlich“ in den Scroll-Zoomoptionen, um die Einstellung abzuschließen. Das Einrichten einer Zwei-Finger-Wischmethode auf Ihrem Apple-Computer ist einfach. Schalten Sie zunächst Ihren Computer ein und klicken Sie oben auf dem Bildschirm auf das Symbol „Einstellungen“. Wählen Sie in der Einstellungsoberfläche die Option „Touchpad“. Klicken Sie dann auf „Scroll-Zoom“ und stellen Sie sicher, dass „Scroll-Richtung“ aktiviert ist

So richten Sie WeChat Mac ein, um Sprachnachrichten automatisch in Text umzuwandeln – So richten Sie die Konvertierung von Sprache in Text ein So richten Sie WeChat Mac ein, um Sprachnachrichten automatisch in Text umzuwandeln – So richten Sie die Konvertierung von Sprache in Text ein Mar 19, 2024 am 08:28 AM

Kürzlich haben einige Freunde den Redakteur gefragt, wie man WeChat Mac so einrichtet, dass er Sprachnachrichten automatisch in Text umwandelt. Im Folgenden finden Sie eine Methode zum Einrichten von WeChat Mac, um Sprachnachrichten automatisch in Text umzuwandeln. Schritt 1: Öffnen Sie zunächst die Mac-Version von WeChat. Wie im Bild gezeigt: Schritt 2: Klicken Sie anschließend auf „Einstellungen“. Wie im Bild gezeigt: Schritt 3: Klicken Sie dann auf „Allgemein“. Wie im Bild dargestellt: Schritt 4: Aktivieren Sie anschließend die Option „Sprachnachrichten im Chat automatisch in Text umwandeln“. Wie im Bild gezeigt: Schritt 5: Schließen Sie abschließend das Fenster. Wie im Bild gezeigt:

Kann der Mac Dateien auf die Festplatte schneiden? Kann der Mac Dateien auf die Festplatte schneiden? Feb 20, 2024 pm 01:00 PM

Einleitung: Dieser Artikel soll Ihnen den relevanten Inhalt zum Schneiden von Dateien auf die Festplatte auf dem Mac vorstellen. Ich hoffe, er wird Ihnen hilfreich sein. Werfen wir einen Blick darauf. So exportieren Sie Fotos auf eine mobile Festplatte auf einem Mac-Computer Sie können den Finder oder die Fotoanwendung verwenden, um Fotos auf eine mobile Festplatte zu exportieren. Wenn Sie den Finder zum Exportieren von Fotos verwenden, stellen Sie zunächst sicher, dass die mobile Festplatte mit dem Mac verbunden ist und vom Mac erfolgreich erkannt wird. Die Schritte zum Übertragen von Fotos vom Mac auf die Festplatte sind einfach: Schließen Sie zunächst die mobile Festplatte an den Computer an und öffnen Sie dann das Symbol [Launcher]. Suchen Sie dann im Popup-Fenster nach dem Symbol [Fotos] und klicken Sie darauf. Halten Sie im geöffneten Fenster [Fotos] die [Umschalt]-Taste gedrückt

3 Möglichkeiten, HEIC-Fotos auf dem Mac in JPG zu konvertieren 3 Möglichkeiten, HEIC-Fotos auf dem Mac in JPG zu konvertieren Mar 15, 2024 pm 08:43 PM

Standardmäßig nimmt das iPhone Fotos von der Kamera im HEIC-Format auf. HEIC steht für High Efficiency Image Container und kann mehr Pixeldaten als PNG- oder JPG-Dateien speichern, wodurch im Vergleich zu anderen Formaten deutlich weniger Speicherplatz auf dem iPhone-Speicher beansprucht wird. Diese Dateien funktionieren am besten auf iPhones, werden jedoch im Internet nicht allgemein akzeptiert, da sie häufig zu verschwommenen/körnigen Bildern führen, wenn Sie sie mit Geräten teilen, die nicht von Apple stammen. Um sicherzustellen, dass HEIC-Bilder auf anderen Geräten kompatibel sind, müssen Sie sie möglicherweise in das JPG-Format konvertieren. In diesem Artikel erfahren Sie, wie Sie HEIC-Bilder auf dem Mac in JPG konvertieren. So konvertieren Sie HEIC-Fotos in JPG auf dem Mac [3 Methoden] Methode

See all articles