PHP运行的生命周期

2020-02-20  本文已影响0人  苏康申
写了多年的Hello World分析下PHP的一生 先看下PHP的模块构成
image.png

大概分析下过程

  1. 我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的;
    PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口)
  2. PHP总共有三个模块:内核、Zend引擎、以及扩展层;
  3. PHP内核用来处理请求、文件流、错误处理等相关操作;
  4. Zend引擎(Zend Engine)用以将源文件转换成机器语言,然后在虚拟机上运行它;
  5. 扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接MySQL数据库;
  6. 当Zend Engine执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;
  7. 最后,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

参考文档
鸟哥博客
深入理解PHP内核

上一篇 下一篇

猜你喜欢

热点阅读