一切的开始:SAPI接口

  SAPI(Server Application Programming Interface)指的是具体应用的编程接口。PHP脚本要执行有很多种方式,通过web服务器,或者直接在命令行下,也可以嵌入在其他程序中。

开始和结束

  php开始执行后会经过两个主要的阶段:处理请求之前的开始阶段和请求之后的结束阶段。

  开始阶段有两个过程:

  第一个过程是模块初始化阶段(MINIT),在整个SAPI生命周期内(例如Apache启动以后的整个生命周期内或者命令行程序整个执行过程中),该过程只进行一次。

  第二个过程是模块激活阶段(RINIT),该过程发生在请求阶段,例如通过url请求某个页面,则在每次请求之前都会进行模块激活(RINIT请求开始)。例如php注册了一些扩展模块,则MINIT阶段会回调所有模块的MINIT函数。模块在这个阶段可以进行一些初始化工作,例如注册常量,定义模块使用的类等等。模块在实现时可以通过如下宏来实现这些回调函数:

PHP_MINIT_FUNCTION(myphpextension)
{
//注册常量或者类等初始化操作
return SUCCESS;
}

请求到达之后php初始化执行脚本的基本环境,例如创建一个执行环境,包括保存php运行过程中变量名称和值内容的符号表,以及当前所有的函数以及类等信息的符号表。然后php会调用所有模块的RINIT函数,在这个阶段各个模块也可以执行一些相关的操作,模块的RINIT函数和MINIT函数类似:

PHP_RINIT_FUNCTION(myphpextension)
{
//例如记录请求开始时间
//随后在请求结束的时候记录结束时间。这样我们就能够记录下处理请求所花费的时间了
return SUCCESS;
}

请求处理完成后就进入了结束阶段,一般脚本执行到末尾或者通过调用exit()或die()函数,php都将进入结束阶段。

结束阶段也分为两个环节,一个在请求结束后停用模块(RSHUTDOWN, 对应RINIT),一个在SAPI声明周期结束(web服务器退出或者命令行脚本执行完毕退出)时关闭模块(MSHUTDOWN,对应MINIT)。

PHP_RSHUTDOWN_FUNCTION(myphpextension)
{
//例如记录请求结束时间,并把相应的信息写入日志文件中
return SUCCESS;
}

单进程SAPI生命周期

CLI/CGI模式的PHP属于单进程的SAPI模式。这类的请求在处理一次请求后就关闭。也就是只会经过如下几个环节: 开始 - 请求开始 - 请求关闭 - 结束 SAPI接口实现就完成了其生命周期。如图2.1所示:

图2.1 单进程SAPI生命周期

如上的图是非常简单,也很好理解。只是在各个阶段之间PHP还做了许许多多的工作。这里做一些补充:

生命周期和Zend引擎的更多相关文章

  1. 深入理解PHP内核(二)概览-PHP生命周期与Zend引擎

    本文参考自<深入理解PHP内核>,地址:https://github.com/reeze/tipi 本文链接:http://www.orlion.ml/232/ 1.SAPI接口 SAPI ...

  2. 第一节 生命周期和Zend引擎

    一切的开始: SAPI接口 SAPI(Server Application Programming Interface)指的是PHP具体应用的编程接口, 就像PC一样,无论安装哪些操作系统,只要满足了 ...

  3. PHP内核之旅-1.生命周期

    1.SAPI接口 PHP具体应用的编程接口. 2.开始和结束 PHP开始执行以后会经过两个主要的阶段: 处理请求之前的开始阶段和请求之后的结束阶段. 1.1开始阶段: 1.1.1 模块初始化阶段(MI ...

  4. (转)php的扩展和嵌入--php的生命周期与变量详述

    本文转自http://blog.csdn.net/cedricliang/article/details/17247749?9435:这是在我想在js的循环中加入一段php,这段php代码会在每次执行 ...

  5. 使用Pipeline抽象业务生命周期流程

    上篇关于流程引擎的文章还是快两年以前的<微服务业务生命周期流程管控引擎>,这中间各种低代码平台层出不穷,虽然有些仅仅是OA+表单的再度包装,但有些的确是在逻辑和操作单元层面进行了真正的高度 ...

  6. 深入理解php底层:php生命周期 [转]

    1.PHP的运行模式: PHP两种运行模式是WEB模式.CLI模式.无论哪种模式,PHP工作原理都是一样的,作为一种SAPI运行. 1.当我们在终端敲入php这个命令的时候,它使用的是CLI. 它就像 ...

  7. PHP内核的学习--PHP生命周期

    一切的开始: SAPI接口 SAPI(Server Application Programming Interface)指的是PHP具体应用的编程接口, 就像PC一样,无论安装哪些操作系统,只要满足了 ...

  8. 3.PHP内核探索:一次请求生命周期

    我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的.PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口). PHP总共有三个模块: ...

  9. PHP 生命周期,Opcode 缓存。

    1.php 执行的生命周期. 用户发出请求---->.php--->词典扫描--->解析--->创建Opcode--->处理opcode--->响应 这就是php的 ...

随机推荐

  1. 【Leetcode】【简单】【1. 两数之和】【JavaScript】

    题目描述 1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能 ...

  2. WCF 使用Stream模式进行文件上传 --节选自Packt.Net.Framework.4.5.Expert.Programming.Cookbook

    使用Stream上传文件 文件上传功能是web程序/服务上常用和必须的功能,WCF也不例外.在4.0版本之前,WCF仅仅提供了buffered模式上传文件.从4.0版本之后,WCF开始提供了Strea ...

  3. Java : 对象不再使用时,为什么要赋值为 null ?

    今天遇到一个比较有意思的问题,对象不再使用时,为什么要赋值为 null ? 在这里我看到一篇文章说的不错,下面是网址,有兴趣的IT友可以看看. https://mp.weixin.qq.com/s/Z ...

  4. i p _ d o o p t i o n s函数

    我们知道 i p i n t r在检测分组的目的地址之前调用 i p _ d o o p t i o n s.i p _ d o o p t i o n s被传给一个指针m,该指针指向某个分组, i ...

  5. 模块讲解---time模块,datetime模块,random模块,hashlib模块和hmac模块,typing模块,requests模块,re模块

    目录 1. 包 2. time模块   1. 优先掌握 2. 了解 3. datetime模块   1. 优先掌握 4. random模块   1. 优先掌握   2. 了解 5. hashlib模块 ...

  6. springboot2.0入门(六)-- ymal语法、数据校验

    一.基本使用 1.ymal语法是一种更符合人类命名习惯的语法: # 1. 一个家庭有爸爸.妈妈.孩子. # 2. 这个家庭有一个名字(family-name)叫做“happy family” # 3. ...

  7. ckeditor不能粘贴word的问题如何解决

    自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了.一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器) ...

  8. [Luogu] 贪婪大陆

    https://www.luogu.org/problemnew/show/P2184 区间修改时只需修改区间端点的numl或numr值 区间查询x-y只需用1-y的numr - 1-(x - 1)的 ...

  9. Linux中查看和修改分区的uuid方便挂载使用

    查看硬盘UUID: 两种方法: ls -l /dev/disk/by-uuid blkid /dev/sda1 修改分区UUID: 1.修改分区的UUID Ubuntu 使用 uuid命令 生成新的u ...

  10. ES6 import、export的写法

    大家都知道来到ES6版本,ES就原生支持JS Module的概念. import和export的写有哪些呢,我们看看 import: import from 和 var 变量一样,也会存在提升,这意味 ...