http://blogread.cn/it/article/5524?f=wb
为了之后能开发PHP扩展,就必定要了解PHP的执行顺序。这篇文章就是为C开发PHP扩展作铺垫。 Web环境咱们假设为Apache。在编译PHP的时候,为了可以让Apache支持PHP,咱们会生成一个mod_php5.so的模块。Apache加载这个模块,在url访问.php文件的时候,就会转给mod_php5.so模块来处理。这个就是咱们常说的SAPI。英文名字是:Server Application Programming Interface。SAPI实际上是一个统称,其下有 ISAPI,CLI SAPI,CGI等。有了它,就能够很容易的跟其余东西交互,好比APACHE,IIS,CGI等。 Apache启动后会将mod_pho5.so模块的hook handler注册进来,当Apache检测到访问的url是一个php文件时,这时候就会把控制权交给SAPI。进入到SAPI后,首先会执行sapi/apache/mod_php5.c 文件的php_init_handler函数,这里摘录一段代码:
该函数主要调用两个函数:sapi_startup(&apache_sapi_module); php_apache_startup(&apache_sapi_module);php
sapi_startup建立一个 sapi_globals_struct结构体。sapi_globals_struct保存了Apache请求的基本信息,如服务器信息,Header,编码等。sapi_startup执行完毕后再执行php_apache_startup。mysql
php_module_startup 内容太多,这里介绍一下大体的做用:sql
1. 初始化zend_utility_functions 结构.这个结构是设置zend的函数指针,好比错误处理函数,输出函数,流操做函数等.apache
2. 设置环境变量.api
3. 加载php.ini配置.服务器
4. 加载php内置扩展.app
5. 写日志.函数
6. 注册php内部函数集.编码
7. 调用 php_ini_register_extensions,加载全部外部扩展url
8. 开启全部扩展
9. 一些清理操做.
重点说一下 3,4,7,8
加载php.ini配置
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
zend_llist_apply函数遍历extension_lists 执行会掉函数 php_load_php_extension_cb
php_load_php_extension_cb
该函数最后调用
将扩展信息放到 Hash表module_registry中,Zend/zend_API.c
最后,zend_startup_modules(TSRMLS_C); 对模块进行排序,并检测是否注册到module_registry HASH表里。zend_startup_extensions(); 执行extension->startup(extension);启动扩展。