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

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Tiada jawapan apabila memasukkan kata laluan pada papan kekunci mac? Tiada jawapan apabila memasukkan kata laluan pada papan kekunci mac? Feb 20, 2024 pm 01:33 PM

Pengenalan: Dalam artikel ini, laman web ini akan memperkenalkan kepada anda kandungan yang berkaitan tentang papan kekunci Mac yang tidak bertindak balas apabila memasukkan kata laluan saya harap ia akan membantu anda, mari lihat. Bagaimana untuk menyelesaikan masalah bahawa kata laluan tidak boleh dimasukkan pada sistem Apple Mac Anda juga boleh cuba menyambungkan papan kekunci ini ke komputer lain untuk melihat sama ada ia berfungsi seperti biasa. Jika masalah yang sama berlaku pada komputer lain, kemungkinan besar ia adalah kesalahan pada papan kekunci itu sendiri. Anda boleh mempertimbangkan untuk menggantikan papan kekunci atau membaikinya. Kali pertama anda log masuk ke Alipay dengan komputer Mac anda, anda akan menemui antara muka log masuk dan tidak boleh memasukkan kata laluan anda. Medan input kata laluan memaparkan: "Sila klik di sini untuk memasang kawalan", jadi log masuk Alipay memerlukan pemasangan kawalan keselamatan. Kawalan keselamatan boleh menyulitkan dan melindungi maklumat yang anda masukkan (jumlah, kata laluan, dll.) untuk meningkatkan keselamatan akaun. Tali leher

3 petua untuk menyesuaikan nama komputer Mac anda, nama hos dan nama Bonjour dengan mudah 3 petua untuk menyesuaikan nama komputer Mac anda, nama hos dan nama Bonjour dengan mudah Mar 06, 2024 pm 12:20 PM

Ramai pengguna Mac cenderung untuk mengekalkan nama lalai peranti mereka dan mungkin tidak pernah mempertimbangkan untuk menukarnya. Ramai orang memilih untuk mengekalkan nama itu daripada persediaan awal, seperti "Johnny's MacBook Air" atau hanya "iMac." Mempelajari cara menukar nama Mac anda ialah kemahiran yang sangat berguna, terutamanya apabila anda mempunyai berbilang peranti, kerana ia boleh membantu anda membezakan dan mengurusnya dengan cepat. Seterusnya, kami akan mengajar anda langkah demi langkah cara menukar nama komputer, nama hos dan nama Bonjour (nama hos tempatan) dalam sistem macOS. Mengapa anda perlu menukar nama Mac anda? Menukar nama Mac anda bukan sahaja boleh menunjukkan keperibadian anda, tetapi juga membantu meningkatkan pengalaman pengguna: Peribadikan Mac anda: Nama lalai mungkin tidak mengikut citarasa anda, tukar kepada nama yang anda suka

Terlupa kata laluan pemasang mac anda? Terlupa kata laluan pemasang mac anda? Feb 20, 2024 pm 01:00 PM

Pengenalan: Dalam artikel ini, laman web ini akan memperkenalkan kepada anda kandungan yang berkaitan tentang melupakan kata laluan program pemasangan Mac Saya harap ia akan membantu anda, mari kita lihat. Perkara yang perlu dilakukan jika anda terlupa kata laluan anda untuk perisian pemasangan komputer Apple Pertama, cari iCloud dalam tetapan telefon dan klik untuk membukanya. Seterusnya, masukkan nombor akaun dan kata laluan anda. Terdapat baris perkataan kecil di bawah butang log masuk yang menggesa anda jika anda terlupa ID atau kata laluan anda Klik pilihan ini. Biasanya, selepas anda memasukkan kata laluan yang salah beberapa kali pada antara muka log masuk, MacBook Pro anda akan menggesa anda untuk menggunakan Apple ID terikat anda untuk menetapkan semula kata laluan anda. Anda hanya perlu mengikuti langkah-langkah yang digesa oleh sistem untuk melengkapkan tetapan semula kata laluan. 3. Mula-mula matikan Mac anda, kemudian mulakan semula Sambil menekan butang kuasa, segera tekan dan tahan com pada papan kekunci.

pkg untuk dipasang pada mac? pkg untuk dipasang pada mac? Feb 20, 2024 pm 03:21 PM

Prakata: Hari ini, tapak ini akan berkongsi dengan anda kandungan yang berkaitan tentang memasang fail pkg pada Mac Jika ia dapat menyelesaikan masalah yang anda hadapi sekarang, jangan lupa untuk mengikuti tapak ini dan mulakan sekarang! Versi sebelumnya macos pkg tidak boleh dipasang untuk menaik taraf sistem pengendalian: Jika komputer riba anda menggunakan versi sistem pengendalian yang lebih lama, adalah disyorkan untuk menaik taraf kepada versi sistem pengendalian terkini. Kerana versi lama mungkin tidak menyokong pemasangan sistem macOS terkini. Pilih "Padam" dalam Utiliti Cakera, kemudian pilih sambungan Macos dalam format, jangan semak pilihan penyulitan, dan jangan pilih format apfs, dan akhirnya klik butang "Padam" untuk menyelesaikan masalah tidak dapat menyelesaikan pemasangan macOS. Seret ikon aplikasi ke fail bermula dengan Apl

Bagaimana untuk menukar halaman semasa menaip pada Apple Mac? Bagaimana untuk menukar halaman semasa menaip pada Apple Mac? Feb 20, 2024 pm 12:54 PM

Pengenalan: Hari ini, tapak ini akan berkongsi dengan anda kandungan yang berkaitan tentang cara menukar halaman semasa menaip pada Apple Mac Jika ia dapat menyelesaikan masalah yang anda hadapi sekarang, jangan lupa untuk mengikuti tapak ini dan mulakan sekarang! Petua untuk menggunakan pad sentuh pada komputer riba Apple MacBook Langkah-langkah untuk menyediakan gelongsor dua jari pada komputer Apple adalah seperti berikut: Cari ikon "Tetapan" pada desktop komputer dan klik padanya. Pilih "Pad sentuh" ​​dalam antara muka tetapan, dan kemudian klik "Tatal ke Zum". Semak "Arah tatal: Semulajadi" dalam pilihan zum tatal untuk melengkapkan tetapan. Menyediakan kaedah leret dua jari pada komputer Apple anda adalah mudah. Mula-mula, hidupkan komputer anda dan klik pada ikon Tetapan di bahagian atas skrin. Dalam antara muka tetapan, pilih pilihan "Pad sentuh". Kemudian klik "Zum Tatal" dan pastikan "Arah Tatal" ditandakan

Bagaimana untuk menyediakan WeChat Mac untuk menukar mesej suara kepada teks secara automatik - Bagaimana untuk menyediakan penukaran suara kepada teks Bagaimana untuk menyediakan WeChat Mac untuk menukar mesej suara kepada teks secara automatik - Bagaimana untuk menyediakan penukaran suara kepada teks Mar 19, 2024 am 08:28 AM

Baru-baru ini, beberapa rakan telah berunding dengan editor tentang cara menyediakan WeChat Mac untuk menukar mesej suara kepada teks secara automatik Berikut ialah kaedah untuk menyediakan WeChat Mac untuk menukar mesej suara secara automatik kepada teks. Langkah 1: Mula-mula, buka WeChat versi Mac. Seperti yang ditunjukkan dalam gambar: Langkah 2: Seterusnya, klik "Tetapan". Seperti yang ditunjukkan dalam gambar: Langkah 3: Kemudian, klik "Umum". Seperti yang ditunjukkan dalam gambar: Langkah 4: Kemudian semak pilihan "Tukar mesej suara secara automatik dalam sembang kepada teks". Seperti yang ditunjukkan dalam gambar: Langkah 5: Akhir sekali, tutup tetingkap. Seperti yang ditunjukkan dalam gambar:

Bolehkah Mac memotong fail ke cakera keras? Bolehkah Mac memotong fail ke cakera keras? Feb 20, 2024 pm 01:00 PM

Pengenalan: Artikel ini di sini untuk memperkenalkan anda kepada kandungan yang berkaitan untuk memotong fail ke cakera keras pada Mac Saya harap ia akan membantu anda, mari lihat. Cara Mengeksport Foto ke Pemacu Keras Mudah Alih pada Komputer Mac Anda boleh menggunakan aplikasi Finder atau Photos untuk mengeksport foto ke pemacu keras mudah alih. Apabila menggunakan Finder untuk mengeksport foto, pastikan dahulu pemacu keras mudah alih disambungkan ke Mac dan berjaya dikenali oleh Mac. Langkah-langkah untuk memindahkan foto dari Mac ke pemacu keras adalah mudah: pertama, sambungkan pemacu keras mudah alih ke komputer, dan kemudian buka ikon [Pelancar]. Kemudian, cari dan klik ikon [Foto] dalam tetingkap timbul. Dalam tetingkap [Foto] yang dibuka, tahan kekunci [Shift].

3 Cara untuk Menukar Foto HEIC kepada JPG pada Mac 3 Cara untuk Menukar Foto HEIC kepada JPG pada Mac Mar 15, 2024 pm 08:43 PM

Secara lalai, iPhone mengambil foto daripada kamera dalam format HEIC. HEIC adalah singkatan kepada Bekas Imej Kecekapan Tinggi dan boleh menyimpan lebih banyak data piksel daripada fail PNG atau JPG, mengambil lebih sedikit ruang pada storan iPhone berbanding format lain. Fail ini berfungsi paling baik pada iPhone tetapi tidak diterima secara meluas di Internet kerana ia sering menghasilkan gambar kabur/berbutir apabila anda berkongsinya dengan peranti bukan Apple. Untuk memastikan imej HEIC serasi pada peranti lain, anda mungkin perlu menukarnya kepada format JPG. Artikel ini akan memperkenalkan cara menukar imej HEIC kepada JPG pada Mac. Cara Menukar Foto HEIC kepada JPG pada Kaedah [3 Kaedah] Mac

See all articles