面试中面试官问你啥问题,博主都给你整理在这儿了。每日都会整理一份最接地气的面试题,期盼能帮忙到你!
同期带上一套视频教程【带你横扫PHP职场 全面诠释PHP面试】,感谢你对本公众号的关注,关注本公众号,回复:160705 就可获取。
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都经过下面几个周期:
1、模块初始化周期(module init)这个周期重点进行PHP框架和Zend引擎的初始化操作。该周期的入口函数为php_module_startup()。
这个周期通常仅在SAPI起步时执行一次,针对Fpm而言,便是在Fpm的master进程起步时执行的。
该周期的几个主要处理如下:
激活SAPI:sapi_activate(),初始化请求信息SG(request_info)、设置读取POST请求的handle等。
起步PHP输出:php_output_startup()
初始化垃圾回收器:gc_globals_ctor(),并分配zend_gc_globals内存。
起步Zend引擎:zend_startup(),重点操作包含
1 起步内存池 start_memory_manager()
2 设置有些util函数句柄,如zend_error_cb、zend_pringf````、zend_write```等。
3 设置Zend虚拟机编译、执行器的函数句柄zend_compile_file、zend_execute_ex、垃圾回收函数句柄gc_collect_cycles
4 分配函数符号表 办法符号表(function_table)、类符号表(class_table)、常量符号表(zend_constants)等,倘若是多线程的话,还会分配编译器、执行器的全局变量
5 注册Zend核心扩展:zend_startup_builtin_funtions(),这个扩展是内核供给的,该过程将注册Zend核心扩展供给的函数,如strlen、define、func_get_args、class_exists等。
6 注册Zend定义的标准常量:zend_register_standard_constants(),例如E_ERROR、E_WARNING、E_ALL、TRUE、FALSE等。
7 注册$GLOBALS超全局变量的获取handle。
8 分配php.ini配置的存储符号表 EG(ini_directives)。
注册PHP定义的常量:PHP_VERSION、PHP_ZTS、PHP_SAPI等。
解析php.ini:解析完成后所有的php.ini配置保留在configuration_hash哈希表中。
映射PHP、Zend核心的php.ini配置:按照解析出的php.ini,获取对应的配置值,将最后的配置插进EG(ini_directives)哈希表。
注册用于获取$_GET、$_POST、$_COOKIE、$_SERVER、$_ENV、$_REQUEST、$_FILES变量的handle。
注册静态编译的扩展:php_register_internal_extensions_func()。
注册动态加载的扩展:php_init_register_extensions(),将php.ini中配置的扩展加载到PHP中。
回调各扩展定义的module startup钩子函数,即经过PHP_MINIT_FUNCTION()定义的函数。
注册php.ini中禁用的函数、类:disable_funstions、disable_classes。
2、请求初始化周期(request init)当一个页面请求出现时,在请求处理前都会经历的一个周期。针对fpm而言,是在worker进程accept一个请求并读取、解析完请求数据后的一个周期。
在这个周期内,SAPI层将掌控权交给PHP层,PHP初始化这次请求执行脚本所需的环境变量。
该周期的处理函数为php_request_startup()。重点处理有以下几个:
(1)激活输出:php_output_activate()
(2)激活Zend引擎:zend_activate(),重点操作有
(2.1)重置垃圾回收器:gc_reset()
(2.2)初始化编译器:ini_compiler()
(2.3)初始化执行器:ini_exexutor(),将 EG(function_table)和 EG(class_table)分别执行 CG(function_table)和CG(class_table)。
(2.4)初始化全局变量符号表 EG(symbol_table)、include过的文件符号表 EG(included_files)
(2.5)初始化词法扫描器:sapi_activate()
(3)激活SAPI:sapi_activate()
(4)回调个扩展定义的request startup钩子函数:zend_activate_modules()
3、php脚本执行周期(execute sccript)(1)该周期包含PHP代码的编译、执行两个核心周期,这亦是Zend引擎最重要的功能。
(2)在编译周期,PHP脚本将经历从PHP源代码到抽象语法树,再到opline指令的转化过程,最后生成的opline指令便是Zend引擎可识别的执行指令,这些指令被执行器执行,这便是PHP代码解释执行的过程。
该周期入口函数为php_execute_script()。
4、请求结束周期(request shutdown)(1)该周期将flush输出内容、发送HTTP应答header头、清理局部变量、关闭编译器、关闭执行器等。
(2)另一,在该周期将回调各扩展的request shutdown钩子函数。
(3)该周期与请求初始化周期操作是相反的。
5、模块关闭周期(module shutdown)该周期在SAPI关闭时执行,与模块初始化周期对应,这个周期重点是进行资源的清理、php各模块的关闭操作,同期,将回调各扩展的module shutdown钩子函数。
这是出现在所有请求都已然结束之后,例如关闭fpm的操作。(这个是针对CGI和CLI等SAPI,无“下一个请求”,因此SAPI立刻起始关闭。)
注:按照区别SAPI的实现,各周期的执行状况会有有些差异,例如命令行模式下,每次执行一个脚本都会完成的经历这些周期。
而FastCgi模式下则在起步时执行一次模块初始化,而后各个请求只经历请求初始化,脚本执行,请求关闭几个周期,在SAPI关闭时,才经历模块关闭周期。
文案来自:https://blog.csdn.net/weixin_33904756/article/details/88857180
以上是本文的所有内容,期盼对大众的学习有帮忙,觉得有用,有需要就支持一下吧
助你面试成功 拿下高薪岗位
微X公众号:PHP面试题
长按二维码关注
学习 | 交流 | 分享 | 文案
|