PHP底层探索(三):一次请求生命周期

时间:2021-07-25 19:21:53

我们从未手动开启过PHP的相关进程,它是随着Apache的启动而永兴的.PHP通过mod_php5.so模块和Apache相连(具体说是SAPI)
PHP总共有三个模块:内核 zend引擎 扩展层

  • php内核用来处理请求,文件流,错误处理等相关操作;
  • zend引擎(ZE) 用来将资源文件转换成机器语言,然后在虚拟机上运行
  • 扩展层是一组函数,类库,和流,php使用它们来进行一些特定的操作;

比如,我们需要mysql扩展来来接mysql数据库;当ZE执行程序时,可能会需要连接若干扩展,这时ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终回馈给浏览器;

深入探讨
Apache启动后,PHP解释程序也随之启动.PHP的启动过程有两部:

  • 第一步是初始化环境变量,这个将在SAPI声明周期内发生作用;
  • 第二部是生成只针对当前请求的一些变量设置;

PHP启动第一步
第一步的操作在任何请求到达之前就发生了.启动Apache后,PHP解释程序也随之启动.PHP调用各个程序的初始化(MINIT)方法.从而使这些扩展切换到可用状态;

PHP启动第二步
当一个页面发生请求时,SAPI层将控制权交给PHP层.于是PHP设置了用于响应本次请求所需的环境变量;同时,他还建立了一个变量表,来存放执行过程中产生的变量名和值.PHP调用各个模块的(RINIT)方法.即”请求初始化”. 一个经典的例子是Session模块的RINIT,如果在php.ini中启用了Session模块.那在调用该模块的RINIT是就会初始化$_SESSION变量,并将相关内容读入;RINIT方法可以看做是一个准备过程,在执行之间就会自动启动;

PHP关闭第一步
如同PHP启动一样,PHP的关闭也分两部,一旦页面执行完毕(无论是执行到了末尾还是exit(),die()函数终止),php就会启动清理程序.他会按顺序调用各个模块的RSHUTDOWN方法.清楚程序运行时生成的符号表,也就是对每个变量进行ubset()函数.

PHP关闭第二步
最后,所有的请求都已经处理完毕,SAPI也准备关闭了,PHP开始执行第二步,PHP调用每个扩展的MSHUTDOWN方法,这是最后一次释放内存的机会;

这样,整个PHP生命周期就结束了.要注意的是,只有在服务器没有请求的情况下,才会执行’启动第一步’,和‘关闭第二步’