写了多年的Hello World分析下PHP的一生 先看下PHP的模块构成
image.png大概分析下过程
- 我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的;
PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口) - PHP总共有三个模块:内核、Zend引擎、以及扩展层;
- PHP内核用来处理请求、文件流、错误处理等相关操作;
- Zend引擎(Zend Engine)用以将源文件转换成机器语言,然后在虚拟机上运行它;
- 扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接MySQL数据库;
- 当Zend Engine执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;
- 最后,Zend Engine将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上
SAPi
SAPi目录下结构如下
apache2handlerr
cgi
cli
embed
fpm
litespeed
phpdbg
tests
SAPI:Server Application Programming Interface服务端应用编程端口。他就是php与其他应用交互的接口,php脚本要执行有很多种方式,通过web服务器,或者直接在命令行下,也可以嵌入其他程序中。SAPI提供了一个和外部通信的接口,常见的SAPI有:cgi、fast-cgi、cli等。
Zend
PHP是一种解释型语言,ZendVM是一个 虚拟计算机,它介于PHP应用与 实际计算机中间,我们写的PHP代码就是被它执行的。ZendVM是PHP语言的核心实现,它的构成主要分为两部分 :编译器、执行器。其中编译器负责将PHP代码解释为执行器可识别的指令,执行器负责执行 编译器 解释出指令。
Extension
扩展是PHP内核提供一套用于扩充PHP功能的一种方式,社区中许多扩扩展供PHP使用,从而似的PHP增加了大量的功能,PHP中 许多函数都是 通过扩展提供的。扩展分为PHP扩展与 Zend 扩展,PHP扩展比较常见,而Zend扩展主要用于ZendVM,它可以做的东西更多,例如Opcache就是Zend扩展
生命周期
main函数
*/
static sapi_module_struct cgi_sapi_module = {
#if PHP_FASTCGI
"cgi-fcgi", /* name */
"CGI/FastCGI", /* pretty name */
#else
"cgi", /* name */
"CGI", /* pretty name */
#endif
php_cgi_startup, /* startup */
php_module_shutdown_wrapper, /* shutdown */
NULL, /* activate */
sapi_cgi_deactivate, /* deactivate */
sapi_cgibin_ub_write, /* unbuffered write */
sapi_cgibin_flush, /* flush */
NULL, /* get uid */
sapi_cgibin_getenv, /* getenv */
php_error, /* error handler */
NULL, /* header handler */
sapi_cgi_send_headers, /* send headers handler */
NULL, /* send header handler */
sapi_cgi_read_post, /* read POST data */
sapi_cgi_read_cookies, /* read Cookies */
sapi_cgi_register_variables, /* register server variables */
sapi_cgi_log_message, /* Log message */
NULL, /* Get request time */
STANDARD_SAPI_MODULE_PROPERTIES
};
1. php_cgi_startup, 当一个应用要调用PHP的时候,这个函数会被调用,对于CGI来说,
它只是简单的调用了PHP的初始化函数:
static int php_cgi_startup(sapi_module_struct *sapi_module)
{
if (php_module_startup(sapi_module, NULL, 0) == FAILURE) {
return FAILURE;
}
return SUCCESS;
}
开始触发 php_module_startup 模块初始化阶段
main函数触发
1.php_module_startup() 模块初始化阶段
2.php_request_startup() 请求初始化阶段
3.php_execute_script() 执行脚本阶段
4.php_request_shutdown() 请求关闭阶段
5.php_module_shutdown() 模块关闭阶段
Cli模式下每次执行脚本以上每个模块都会触发,但是在FastCgi模式下启动master
进程的时候会触发php_module_startup模块初始化,之后将循环2、3、4三个阶段,
之后master进程结束才会触发5.php_module_shutdown模块关闭阶段
image.png
网友评论