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

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

导读:本篇文章本站来给大家介绍有关mac键盘输入密码无反应的相关内容,希望对大家有所帮助,一起来看看吧。苹果Mac系统无法输入密码如何解决还可以尝试在其他计算机上连接这个键盘,看看是否正常工作。如果在另一台计算机上也出现同样的问题,那么很可能是键盘本身的故障。您可以考虑更换键盘或者修理它。第一次用你的Mac电脑登录支付宝时,你会发现登录界面,无法输入密码。密码输入栏显示:“请点此安装控件”,所以支付宝登录需要安装安全控件。安全控件,可以对你输入的信息(金额、密码等)进行加密保护,提高账号安全。系

许多Mac用户往往习惯保留设备的默认名称,可能从未考虑过更改。很多人选择沿用初始设置时的名称,例如“张三的MacBookAir”或简单的“iMac”。学会如何修改Mac的名称是一项非常实用的技能,尤其是在拥有多台设备时,可以帮助你快速区分和管理它们。接下来,我们将一步步教你如何在macOS系统中更改计算机名称、主机名和Bonjour名称(本地主机名)。为什么要更改Mac名称?修改Mac名称不仅能彰显个性,还能有助于提升使用体验:个性化你的Mac:默认名称可能并不符合你的口味,换一个自己喜欢的名字

导读:本篇文章本站来给大家介绍有关mac装程序密码忘了的相关内容,希望对大家有所帮助,一起来看看吧。苹果电脑安装软件密码忘了怎么办首先,在手机设置中找到iCloud并点击打开。接着,输入账号和密码。在登录按钮下方有一行小字,提示是否忘记ID或密码,点击这个选项。通常情况下,当您在登录界面多次输入错误密码后,MacBookPro会提示您使用已绑定的AppleID来重置密码。您只需按照系统提示的步骤进行操作即可完成密码重置。3、首先将Mac关机,然后重新开机,按下电源键的同时,立刻按住键盘上的com

导语:今天本站来给各位分享关于苹果mac打字怎么翻页的相关内容,如果能正好解决你现在面临的问题,别忘了关注本站,现在开始吧!苹果MacBook笔记本电脑的触摸板使用技巧苹果电脑设置双指滑动的步骤如下:在电脑桌面上找到“设置”图标并点击。在设置界面中选择“触控板”,然后点击“滚动缩放”。在滚动缩放选项中勾选“滚动方向:自然”即可完成设置。在苹果电脑上设置使用两指滑动的方法很简单。首先,打开电脑并点击屏幕顶部的“设置”图标。在设置界面中,选择“触控板”选项。然后点击“滚动缩放”,确保勾选了“滚动方向

前言:今天本站来给各位分享关于pkg文件安装mac的相关内容,如果能正好解决你现在面临的问题,别忘了关注本站,现在开始吧!macos过往版本pkg无法安装升级操作系统:如果您的笔记本电脑正在使用较老的操作系统版本,建议升级到最新的操作系统版本。因为较老的版本可能无法支持安装最新的macOS系统。在磁盘工具中选择“抹掉”,然后在格式中选择Macos扩展,不要勾选加密选项,也不要选择apfs格式,最后点击“抹掉”按钮,这样就可以解决无法完成macOS安装的问题。将应用程序的图标拖到以App开头的文件

近日有一些小伙伴咨询小编微信mac如何设置语音消息自动转成文字?下面就为大家带来了微信mac设置语音消息自动转成文字的方法,有需要的小伙伴可以来了解了解哦。第一步:首先,打开Mac版微信。如图:第二步:接着,点击『设置』。如图:第三步:然后,点击『通用』。如图:第四步:再勾选『聊天中的语音消息自动转成文字』选项即可。如图:第五步:最后,关闭窗口即可。如图:

前言:很多朋友问到关于vmmac虚拟机全屏的相关问题,本文本站就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!mac虚拟机守望先锋没有画面原因:显卡兼容性问题。如果曾经正常运行《守望先锋》,但现在黑屏,可能是因为显卡驱动出现故障。解决:检查显卡是否支持游戏要求。更新显卡驱动程序。尝试使用不同的电源来排除第二种可能性。检查主板是否存在异常情况,如电容是否凸起(可能已被击穿),主板表面是否有明显损坏导致线路中断等情况。建议将主板送至维修站进行检查,如果条件允许,可以考虑更换另一

默认情况下,iPhone以HEIC格式从相机拍摄照片。HEIC代表高效图像容器,可以容纳比PNG或JPG文件更多的像素数据,与其他格式相比,在iPhone存储上占用的空间显着减少。这些文件在iPhone上效果最佳,但并未在互联网上得到广泛接受,因为当您与非Apple设备共享这些文件时,它们通常会导致图片模糊/有颗粒感。为了确保HEIC图片在其他设备上可兼容,可能需要将其转换为JPG格式。本文将介绍在Mac上将HEIC图像转换为JPG的方法。如何在Mac上将HEIC照片转换为JPG[3种方法]方法
