[转]PHP的实践流程,PHP扩张加载过程

2020-01-31 01:23栏目:龙竞技官网
TAG:

可以通过函数php_sapi_name()获取web服务器与php间的接口类型,有如下代码:

原文:

<?php echo php_sapi_name();

为了以后能开发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.

若通过浏览器访问可得:

如下图:

图片 1浏览器访问.png

图片 2

若通过命令php.exe D:wwwtestt1.php访问可得:

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

图片 3命令行访问.png

1234567891011121314151617181920 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 ZTStsrm_startup(1, 1, 0, NULL);#endifsapi_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}

函数php_sapi_name()可能返回的值包括但不限于aolserver, apache, apache2filter, apache2handler, caudium, cgi, cgi-fcgi, cli, cli-server, continuity, embed, fpm-fcgi, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux, webjames等。

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

123456789101112131415 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,编码等.

123456 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;}

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

版权声明:本文由龙竞技官网发布于龙竞技官网,转载请注明出处:[转]PHP的实践流程,PHP扩张加载过程