PHP 生命周期

想做一些关于框架的生命周期的探讨, 又一想, 在那之前很有必要做一下PHP生命周期的功课

SAPI: 一切的开始

什么是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中常用的SAPIcli(命令行模式,单进程)、php-fpmCGIApache

有点像策略模式,使用相同的接口,但是实现会略有不同。

深入理解Zend SAPIs(Zend SAPI Internals)

PHP的启动和终止

请求之前的开始阶段

  • MINIT: 模块初始化阶段, 初始化一些扩展、常量、类、资源、等所有被php脚本用到的东西. (常驻内存, 可以被所有请求使用)
1
2
3
4
5
PHP_MINIT_FUNCTION(myphp_extentsion)
{
// 注册常量或者类等初始化操作
return SUCCESS;
}
  • PRINT: 模块激活阶段, PHP惠调用所有模块的RINIT函数, 在这个阶段各个模块也可以执行一些相关的操作, 比如初始化本次请求使用到的变量
1
2
3
4
5
6
PHP_RINIT_FUNCTION(myphp_extension)
{
// 例如记录请求开始时间
// 随后在请求结束的时候记录结束时间, 这样我们就能够记录下处理请求所花费的时间了
return SUCCESS;
}

请求之后的结束阶段

  • RSHUTDOWN: 这个页面请求执行完毕,或者被用户给die(exit)了, 这时PHP会启动回收程序,回收本次请求使用的资源。
    这次会执行所有已加载扩展的RSHUTDOWN(俗称Request Shutdown)方法, 这时候扩展可以利用内核中的变量表等做的一些事情
    。因为PHP一旦把所有扩展的RSHUTDOWN方法执行完,便会释放掉这次请求使用过的所有资源,比如变量表的所有变量、所有在这次请求中申请的内存等
1
2
3
4
5
PHP_RSHUTDOWN_FUNCTION(myphp_extension)
{
// 例如记录请求结束时间, 并把相应的信息写入到日志文件中
return SUCCESS;
}
  • MSHUTDOWN: PHP执行所有扩展的MSHUDOWN, 释放资源.
1
2
3
4
5
PHP_MSHUTDOWN_FUNCTION(extension_name)
{
// 自由处理程序和持久内存等
return SUCCESS;
}

PHP的生命周期

单进程SAPI生命周期(CLI/CGI)

单进程SAPI

多进程SAPI生命周期(Apache2)

多进程SAPI

多线程SAPI生命周期

多线程SAPI

Embed

Embed SAPI是一种比较特殊的sapi, 容许你在C/C++语言中调用PHP/ZE提供的函数。

使用PHP Embed SAPI实现Opcodes查看器

图片基本是从参考链接那边拿过来, 站在前人的肩膀上

参考

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2023 Keep It Simple And Stupid All Rights Reserved.

访客数 : | 访问量 :