博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP底层探索(三):一次请求生命周期
阅读量:4096 次
发布时间:2019-05-25

本文共 994 字,大约阅读时间需要 3 分钟。

我们从未手动开启过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生命周期就结束了.要注意的是,只有在服务器没有请求的情况下,才会执行’启动第一步’,和‘关闭第二步’

转载地址:http://eyoii.baihongyu.com/

你可能感兴趣的文章
Kafka | 请求是怎么被处理的?
查看>>
Java并发编程1-线程池
查看>>
CentOS7,玩转samba服务,基于身份验证的共享
查看>>
计算机网络-网络协议模型
查看>>
计算机网络-OSI各层概述
查看>>
Java--String/StringBuffer/StringBuilder区别
查看>>
mySQL--深入理解事务隔离级别
查看>>
分布式之redis复习精讲
查看>>
数据结构与算法7-栈
查看>>
线性数据结构学习笔记
查看>>
Java并发编程 | 一不小心就死锁了,怎么办?
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
(python版)《剑指Offer》JZ06:旋转数组的最小数字
查看>>
(python版)《剑指Offer》JZ13:调整数组顺序使奇数位于偶数前面
查看>>
(python版)《剑指Offer》JZ28:数组中出现次数超过一半的数字
查看>>
(python版)《剑指Offer》JZ30:连续子数组的最大和
查看>>
(python版)《剑指Offer》JZ32:把数组排成最小的数
查看>>
(python版)《剑指Offer》JZ02:替换空格
查看>>
JSP/Servlet——MVC设计模式
查看>>
使用JSTL
查看>>