1,我们从未手动开启过php的相关进程,它是随着apache的启动而运行的。
2,php通过mod_php5.so模块与Apache相连(具体说来是SAPI,即服务器应用程序变成接口)。
3,php总共有三个模块:内核,Zend引擎,扩展层。
php内核用来处理请求,文件流,错误处理等相关操作。
Zend引擎(ZE)用以将源文件转换成机器语言,然后再虚拟机上运行。
扩展层是一组函数,类库和流,php使用他们来执行一些特定的操作。比如,我们需要mysql扩展来连接mysql数据库。
当ZE执行程序时可能会需要链接若干个扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;
最后ZE讲处理结果返还给php内核,它再将结果传送给SAPI层,最终输出到浏览器。
详细解释:
php启动第一步:
Apache启动后,php解释程序也随之启动;
php调用各个扩展的MINIT方法,从而使这些扩展切换到可用状态,看看php.ini 文件里打开了那些扩展。
MINIT 的意思是"模块初始化",各个模块都定义了一组函数、类库等用以处理其他请求。
php启动第二步:
当一个页面请求发生时,SAPI层将权限交给php层,于是php设置了回复本次请求所需的环境变量。
同时他还建立一个变量表,用来存放执行过程中产生的变量名和值。
php调用各个模块的RINIT方法,即“请求初始化”。
一个经典的例子就是session模块的RINIT,如果在php中启用了Session模块,那在调用该模块的RINIT方法时就会初始化$_SESSION变量,并将相关内容读入。
RINIT可以看做是一个准备过程,在程序执行期间就会自动启动。
php关闭第一步:
如同php启动一样,关闭也分两个步骤。
一单页面执行完毕(无论是执行到了文件末尾还是用exit或die函数终止),php就会启动清理程序,它会按顺序调用各个模块的RSHUTDOWN方法。
RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。
php关闭第二步:
最后所有的请求都已处理完毕,SAPI也准备关闭了,php开始执行第二步:
php调用每个模块的MSHOTDOWN方法,这是各个模块最后一次释放内存的机会。
这样,整个php的生命周期结束了。
需要注意的是,只有在服务器没有请求的情况下才会执行启动第一步和关闭第二步,