首页 PHP学习教程

学习PHP底层,咱们来看看PHP的工作原理与生命周期

From:

php是一门适用于web开发的动态语言,它可以说是一个用C语言实现的包含大量组件的软件框架。那么,php是如何工作的呢?它的生命周期是怎么样的呢?


表层分析

php是以请求/响应为周期运行服务端应用程序,当请求进入应用程序,流程如下:

php的每一个请求都会重复以上的交互。


底层分析

php的运行模式有两种:web模式和cli模式。无论是哪种公众模式,php的工作原理都是一样的,都是作为一种SAPI运行。

首先,认识下SAPI是什么?

Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口。

Sapi通过一系列钩子函数,使得PHP可以和外围交互数据,这是PHP非常优雅和成功的一个设计,通过sapi成功的将PHP本身和上层应用解耦隔离。

PHP可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。

常见的SAPI有cli、cgi、php-fpm以及各服务具体的sapi。

生命周期

在php的生命周期中,有4个关键调用:

以nginx服务器为例,在web模式下, 生命周期流程 如下:

SAPI运行PHP都经过下面几个阶段:


php_module_startup()

master

该阶段的几个主要处理如下:


sapi_activate()
request_info
php_output_startup()
gc_globals_ctor()
zend_gc_globals
zend_startup()

start_memory_manager()

zend_error_cb
zend_pringf````、

zend_compile_file
zend_execute_ex
gc_collect_cycles

function_table
class_table
zend_constants

zend_startup_builtin_funtions()
strlen
define
func_get_args
class_exists

zend_register_standard_constants()
E_ERROR
E_WARNING
E_ALL
TRUE
FALSE

$GLOBALS
handle

ini_directives

PHP_VERSION
PHP_ZTS
PHP_SAPI
configuration_hash
$_GET
$_POST
$_COOKIE
$_SERVER
$_ENV
$_REQUEST
$_FILES
handle
php_register_internal_extensions_func()
php_init_register_extensions()
module startup
PHP_MINIT_FUNCTION()
disable_funstions
disable_classes

2、请求初始化阶段(request init)
当一个页面请求发生时,在请求处理前都会经历的一个阶段。对于fpm而言,是在worker进程accept一个请求并读取、解析完请求数据后的一个阶段。

在这个阶段内,SAPI层将控制权交给PHP层,PHP初始化本次请求执行脚本所需的环境变量。


php_request_startup()

php_output_activate()

zend_activate()

gc_reset()

ini_compiler()

ini_exexutor()
function_table
class_table
function_table
class_table

symbol_table
included_files

sapi_activate()

sapi_activate()

zend_activate_modules()

3、php脚本执行阶段(execute sccript)
(1)该阶段包括PHP代码的编译、执行两个核心阶段,这也是Zend引擎最重要的功能。

(2)在编译阶段,PHP脚本将经历从PHP源代码到抽象语法树,再到opline指令的转化过程,最终生成的opline指令就是Zend引擎可识别的执行指令,这些指令被执行器执行,这就是PHP代码解释执行的过程。


php_execute_script()

HTTP
header

request shutdown

(3)该阶段与请求初始化阶段操作是相反的。


module shutdown

这是发生在所有请求都已经结束之后,例如关闭fpm的操作。(这个是对于CGI和CLI等SAPI,没有“下一个请求”,所以SAPI立刻开始关闭。)


注:根据不同SAPI的实现,各阶段的执行情况会有一些差异,比如命令行模式下,每次执行一个脚本都会完成的经历这些阶段。

而FastCgi模式下则在启动时执行一次模块初始化,然后各个请求只经历请求初始化,脚本执行,请求关闭几个阶段,在SAPI关闭时,才经历模块关闭阶段。