想做一些关于框架的生命周期的探讨, 又一想, 在那之前很有必要做一下
PHP
生命周期的功课
SAPI
: 一切的开始
什么是SAPI
? 为什么先讲这个 ? 看下图!
SAPI(Server Application Programming Interface 服务器端应用编程端口) is an application programming interface (API)
provided by the web server to help other developers in extending the web server capabilities.
SAPI
是一个用来帮助其他开发程序扩展web
服务器功能的应用程序接口(api
)
它将外部条件抽象,为内部的PHP
提供一套固定统一的接口,使得PHP
自身实现能够不受外部环境影响,保持一定的独立性。
PHP
中常用的SAPI
有cli
(命令行模式,单进程)、php-fpm
、CGI
、Apache
…
有点像策略模式,使用相同的接口,但是实现会略有不同。
PHP
的启动和终止
请求之前的开始阶段
MINIT
: 模块初始化阶段, 初始化一些扩展、常量、类、资源、等所有被php
脚本用到的东西. (常驻内存, 可以被所有请求使用)
1 | PHP_MINIT_FUNCTION(myphp_extentsion) |
PRINT
: 模块激活阶段,PHP
惠调用所有模块的RINIT
函数, 在这个阶段各个模块也可以执行一些相关的操作, 比如初始化本次请求
使用到的变量
1 | PHP_RINIT_FUNCTION(myphp_extension) |
请求之后的结束阶段
RSHUTDOWN
: 这个页面请求执行完毕,或者被用户给die(exit)了, 这时PHP会启动回收程序,回收本次请求使用的资源。
这次会执行所有已加载扩展的RSHUTDOWN
(俗称Request Shutdown
)方法, 这时候扩展可以利用内核中的变量表等做的一些事情
。因为PHP
一旦把所有扩展的RSHUTDOWN
方法执行完,便会释放掉这次请求使用过的所有资源,比如变量表的所有变量、所有在这次请求中申请的内存等
1 | PHP_RSHUTDOWN_FUNCTION(myphp_extension) |
MSHUTDOWN
:PHP
执行所有扩展的MSHUDOWN
, 释放资源.
1 | PHP_MSHUTDOWN_FUNCTION(extension_name) |
PHP
的生命周期
单进程SAPI
生命周期(CLI/CGI
)
多进程SAPI
生命周期(Apache2
)
多线程SAPI
生命周期
Embed
Embed SAPI
是一种比较特殊的sapi
, 容许你在C/C++
语言中调用PHP/ZE
提供的函数。
图片基本是从参考链接那边拿过来, 站在前人的肩膀上