2024年3月13日发(作者:)

细读PHP的生命周期

细读PHP的生命周期

导语:PHP是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利

于学习,使用广泛,主要适用于Web开发领域。下面我们来看看PHP的生命周期,希望

对大家有所帮助。

启动

在调用每个模块的模块初始化前,会有一个初始化的过程,它包括:

初始化若干全局变量

这里的初始化全局变量大多数情况下是将其设置为NULL,有一些除外,比如设置

zuf(zend_utility_functions),以_function = php_printf为例,这里的

php_printf在zend_startup函数中会被赋值给zend_printf作为全局函数指针使用,而

zend_printf函数通常会作为常规字符串输出使用,比如显示程序调用栈的

debug_print_backtrace就是使用它打印相关信息。

初始化若干常量

这里的常量是PHP自己的一些常量,这些常量要么是硬编码在程序中,比如

PHP_VERSION,要么是写在配置头文件中,比如PEAR_EXTENSION_DIR,这些是写在

config.w32.h文件中。

初始化ZEND引擎和核心组件

前面提到的zend_startup函数的作用就是初始化ZEND引擎,这里的初始化操作包

括内存管理初始化、全局使用的函数指针初始化(如前面所说的zend_printf等),对

PHP源文件进行词法分析、语法分析、中间代码执行的函数指针的赋值,初始化若干

HashTable(比如函数表,常量表等等),为ini文件解析做准备,为PHP源文件解析做

准备,注册内置函数(如strlen、define等),注册标准常量(如E_ALL、TRUE、NULL

等)、注册GLOBALS全局变量等。

解析

php_init_config函数的作用是读取文件,设置配置参数,加载zend扩展并

注册PHP扩展函数。此函数分为如下几步:初始化参数配置表,调用当前模式下的ini初

始化配置,比如CLI模式下,会做如下初始化:

INI_DEFAULT("report_zend_debug", "0");

INI_DEFAULT("display_errors", "1");

不过在其它模式下却没有这样的初始化操作。接下来会的各种操作都是查找ini文件:

判断是否有php_ini_path_override,在CLI模式下可以通过-c参数指定此路径(在

php的命令参数中-c表示在指定的路径中查找ini文件)。

如果没有php_ini_path_override,判断php_ini_ignore是否为非空(忽略

配置,这里也就CLI模式下有用,使用-n参数)。