天涯论坛

 找回密码
 立即注册
搜索
查看: 23|回复: 2

面试问:PHP的工作原理是怎么样的,说说PHP的生命周期

[复制链接]

3067

主题

3万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99139032
发表于 2024-10-4 18:09:50 | 显示全部楼层 |阅读模式

面试中面试官问你啥问题,博主都给你整理在这儿了。每日都会整理一份最接地气的面试题,期盼帮忙到你!

同期带上一套视频教程【带你横扫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_cbzend_pringf````、zend_write```等。

3 设置Zend虚拟机编译、执行器的函数句柄zend_compile_filezend_execute_ex、垃圾回收函数句柄gc_collect_cycles

4 分配函数符号表 办法符号表(function_table)、类符号表(class_table)、常量符号表(zend_constants)等,倘若是多线程的话,还会分配编译器、执行器的全局变量

5 注册Zend核心扩展:zend_startup_builtin_funtions(),这个扩展是内核供给的,该过程将注册Zend核心扩展供给的函数,如strlendefinefunc_get_argsclass_exists等。

6 注册Zend定义的标准常量:zend_register_standard_constants()例如E_ERRORE_WARNINGE_ALLTRUEFALSE等。

7 注册$GLOBALS超全局变量的获取handle

8 分配php.ini配置的存储符号表 EG(ini_directives)。

注册PHP定义的常量:PHP_VERSIONPHP_ZTSPHP_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_funstionsdisable_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面试题

长按二维码关注

学习  |  交流  |  分享  |  文案 





上一篇:用PHP这么久了,有些人还不晓得它是怎么样工作的
下一篇:奥秘的磨房招人吗?招,况且这份工作便是做你兴趣的事
回复

使用道具 举报

3095

主题

3万

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99098750
发表于 2024-10-13 10:29:07 | 显示全部楼层
顶楼主,说得太好了!
回复

使用道具 举报

2992

主题

3万

回帖

9956万

积分

论坛元老

Rank: 8Rank: 8

积分
99569148
发表于 2024-11-7 12:47:20 | 显示全部楼层
回顾历史,我们不难发现:无数先辈用鲜血和生命铺就了中华民族复兴的康庄大道。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-24 23:39 , Processed in 0.136323 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.