深入PHP的工作原理和生命周期
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">php是一门适用于web<span style="color: black;">研发</span>的动态语言,它<span style="color: black;">能够</span>说是一个用C语言实现的<span style="color: black;">包括</span><span style="color: black;">海量</span>组件的软件框架。<span style="color: black;">那样</span>,php是<span style="color: black;">怎样</span>工作的呢?它的生命周期是怎么样的呢?</p>
<h2 style="color: black; text-align: left; margin-bottom: 10px;">表层分析</h2>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">php是以请求/响应为周期运行服务端应用程序,当请求进入应用程序,流程如下:</p>
<div style="color: black; text-align: left; margin-bottom: 10px;"><img src="https://pic3.zhimg.com/80/v2-93be73f6c4512c8277d6498d54523ba2_720w.webp" style="width: 50%; margin-bottom: 20px;"></div>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">php的每一个请求都会重复以上的交互。</p>
<h2 style="color: black; text-align: left; margin-bottom: 10px;">底层分析</h2>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">php的运行模式有两种:web模式和cli模式。<span style="color: black;">没</span>论是哪种公众模式,php的工作原理都是<span style="color: black;">同样</span>的,都是<span style="color: black;">做为</span>一种SAPI运行。<span style="color: black;">首要</span>,认识下SAPI,它是什么?</p>Sapi全<span style="color: black;">叫作</span>是Server Application Programming Interface,<span style="color: black;">亦</span><span style="color: black;">便是</span>服务端应用编程接口,Sapi<span style="color: black;">经过</span>一系列钩子函数,使得PHP<span style="color: black;">能够</span>和外围交互数据,这是PHP非常优雅和成功的一个设计,<span style="color: black;">经过</span>sapi成功的将PHP本身和上层应用<a style="color: black;">解耦</a>隔离,PHP<span style="color: black;">能够</span><span style="color: black;">再也不</span><span style="color: black;">思虑</span><span style="color: black;">怎样</span>针对<span style="color: black;">区别</span>应用进行兼容,而应用本身<span style="color: black;">亦</span><span style="color: black;">能够</span>针对自己的特点实现<span style="color: black;">区别</span>的处理方式。<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">平常</span>的SAPI有cli、cgi、php-fpm以及各服务<span style="color: black;">详细</span>的sapi。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">在php的生命周期中,有4个关键调用:</p>
<div style="color: black; text-align: left; margin-bottom: 10px;"><img src="https://pic3.zhimg.com/80/v2-dbcb50bba0a8ed451a62a816c803dc7a_720w.webp" style="width: 50%; margin-bottom: 20px;"></div>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">以<a style="color: black;">nginx</a><a style="color: black;">服务器</a>
</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">为例,在web模式下,生命周期流程如下:</p>
<div style="color: black; text-align: left; margin-bottom: 10px;"><img src="https://pic2.zhimg.com/80/v2-c57b04e348c484a20450311fab324921_720w.webp" style="width: 50%; margin-bottom: 20px;"></div>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">SAPI运行PHP都经过下面几个<span style="color: black;">周期</span>:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">1、模块初始化<span style="color: black;">周期</span>(module init):</p>这个<span style="color: black;">周期</span><span style="color: black;">重点</span>进行php框架、zend引擎的初始化操作。这个<span style="color: black;">周期</span><span style="color: black;">通常</span>是在SAPI<span style="color: black;">起步</span>时执行一次,<span style="color: black;">针对</span>FPM而言,<span style="color: black;">便是</span>在fpm的master进行<span style="color: black;">起步</span>时执行的。php加载<span style="color: black;">每一个</span>扩展的代码并调用其模块初始化例程(MINIT),进行<span style="color: black;">有些</span>模块所需变量的申请,内存分配等。
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">2、请求初始化<span style="color: black;">周期</span>(request init):</p>当一个页面请求<span style="color: black;">出现</span>时,在请求处理前都会经历的一个<span style="color: black;">周期</span>。<span style="color: black;">针对</span>fpm而言,是在worker进程accept一个请求并读取、解析完请求数据后的一个<span style="color: black;">周期</span>。在这个阶段内,SAPI层将<span style="color: black;">掌控</span>权交给PHP层,PHP初始化<span style="color: black;">这次</span>请求执行脚本所需的环境变量。
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">3、php脚本执行<span style="color: black;">周期</span></p>php代码解析执行的过程。Zend引擎接管<span style="color: black;">掌控</span>权,将php脚本代码编译成opcodes并<span style="color: black;">按序</span>执行
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">4、请求结束<span style="color: black;">周期</span>(request shutdown):</p>请求处理完后就进入了结束<span style="color: black;">周期</span>,PHP就会<span style="color: black;">起步</span>清理程序。这个<span style="color: black;">周期</span>,将flush输出内容、发送http响应内容等,<span style="color: black;">而后</span>它会按<span style="color: black;">次序</span>调用各个模块的RSHUTDOWN<span style="color: black;">办法</span>。 RSHUTDOWN用以清除程序运行时产生的符号表,<span style="color: black;">亦</span><span style="color: black;">便是</span>对<span style="color: black;">每一个</span>变量调用unset函数。
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">5、模块关闭<span style="color: black;">周期</span>(module shutdown):</p>该<span style="color: black;">周期</span>在SAPI关闭时执行,与模块初始化<span style="color: black;">周期</span>对应,这个<span style="color: black;">周期</span><span style="color: black;">重点</span>是进行资源的清理、php各模块的关闭操作,<span style="color: black;">同期</span>,将回调各扩展的module shutdown钩子函数。这是<span style="color: black;">出现</span>在所有请求都<span style="color: black;">已然</span>结束之后,例如关闭fpm的操作。(这个是<span style="color: black;">针对</span>CGI和CLI等SAPI,<span style="color: black;">无</span>“下一个请求”,<span style="color: black;">因此</span>SAPI立刻<span style="color: black;">起始</span>关闭。)
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">PHP的核心架构图</p>
<div style="color: black; text-align: left; margin-bottom: 10px;"><img src="https://pic3.zhimg.com/80/v2-fb64b45eaf7062f7b9ea250248c05a7a_720w.webp" style="width: 50%; margin-bottom: 20px;"></div>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">以上内容<span style="color: black;">期盼</span><span style="color: black;">帮忙</span>到大家,<span style="color: black;">更加多</span>PHP大厂PDF面试文档,PHP进阶架构视频资料,PHP精彩好文免费获取<span style="color: black;">能够</span>关注公众号:PHP开源社区,<span style="color: black;">或</span><span style="color: black;">拜访</span>:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><a style="color: black;">2021金三银四大厂面试真题集锦,必看!</a></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><a style="color: black;">四年精华PHP技术<span style="color: black;">文案</span>整理合集——PHP框架篇</a></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><a style="color: black;">四年精华PHP技术文合集——微服务架构篇</a></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><a style="color: black;">四年精华PHP技术文合集——分布式架构篇</a></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><a style="color: black;">四年精华PH</a>P技术文合集——高并发场景篇</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><a style="color: black;">四年精华PHP技术<span style="color: black;">文案</span>整理合集——数据库篇</a></p>
楼主果然英明!不得不赞美你一下! 你的见解真是独到,让我受益匪浅。
页:
[1]