美文网首页
PHP运行的生命周期

PHP运行的生命周期

作者: 苏康申 | 来源:发表于2020-02-20 17:33 被阅读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内核

相关文章

  • php生命周期问题

    选用php作为后端语言就不得不清楚php生命周期的问题 php生命周期和运行模式有很大的关系 cli模式 : 1....

  • PHP运行的生命周期

    写了多年的Hello World分析下PHP的一生 先看下PHP的模块构成 大概分析下过程 我们从未手动开启过P...

  • PHP的学习

    PHP运行领域 。 PHP运行环境 PHP网页运行原理 安装apache 配置apache以运行PHP程序 用法1...

  • PHP运行模式和生命周期

    PHP运行模式主要有四种 1 cgi2 fast-cgi3 cli 命令行4 web模块模式 CGI模式 CGI(...

  • swoole源码学习-一键协程化的enableCoroutine

    图1是enableCoroutine在php生命周期中的大概位置,关于php生命周期详细的展示可以参考https:...

  • php 相关文章

    一、php 1. php -f a.php 运行指定文件 2. php -r "echo 'aaa';" 运行指定...

  • PHP 日期加减计算方法示例

    PHP 标准的日期格式 PHP 简单的日期加减计算 运行结果: PHP 进阶的日期加减计算 运行结果: PHP 高...

  • Vue3:组件的生命周期与数据共享

    1、组件的生命周期 1.1 组件运行的过程 运行过程 组件的生命周期指的是:组件从创建 -> 运行(渲染) -> ...

  • docker安装php环境

    docker安装php运行环境 php的运行环境主要有php,mysql,nginx,redis 首先安装ngin...

  • Funboot系统环境

    系统环境 目录 运行环境准备 集成运行环境 运行环境准备 PHP >= 7.3 PHP OpenSSL 扩展 PH...

网友评论

      本文标题:PHP运行的生命周期

      本文链接:https://www.haomeiwen.com/subject/gfsgfhtx.html