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


    本文参考自《深入理解PHP内核》,地址:https://github.com/reeze/tipi

    本文链接:http://www.orlion.ml/232/

    1、SAPI接口

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

    虽然通过web服务器和命令行程序执行脚本看起来很不一样,但是实际的流程是一样的。只不过是web服务器方式是将php脚本执行结果返回给web服务器,命令行是将结果打印到控制台。

    脚本执行的开始都是以SAPI接口实现开始的,只是不同的SAPI接口实现会完成他们特定的工作,例如Apache的mod_php SAPI实现需要初始化从Apache获取的一些信息,在输出内容是将内容返回给Apache,其他SAPI实现也类似

    2、开始和结束

     (1)PHP开始执行后会经过两个阶段:处理请求之前的开始阶段和请求之后的结束阶段。开始阶段有两个过程:第一个过程是模块初始化阶段(MINIT),在整个SAPI生命周期内(例如Apache启动之后的整个生命周期或者命令行程序整个执行过程中),该过程只进行一次。第二个过程是模块激活阶段(RINIT),该过程发生在请求阶段,例如通过url请求某个页面,则在每次请求之前都会进行模块激活(RINIT请求开始)。例如PHP注册了一些扩展模块,则在MINIT阶段回调所有模块的MINIT函数。模块在这个阶段进行一些初始化工作,例如注册常量,定义模块使用的类等等。模块在实现时可以通过如下宏来实现这些回调函数:

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

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

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

    请求处理完之后就进入结束阶段,一般脚本执行到末尾或者通过调用die()或exit()函数,PHP都将进入结束阶段。结束阶段也有两个环节:一个在请求结束后停用模块(RSHUTDOWN,对应RINIT),一个在SAPI生命周期结束(web服务器退出或者命令行脚本执行完毕退出)时关闭模块(MSHUTDOWN,对应MINIT)。

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

    (2)单进程SAPI生命周期

    CLI/CGI模式的PHP属于单进程的SAPI模式。这类请求在处理一次请求后就关闭了。SAPI生命周期:开始-请求开始-请求关闭-结束 

    (3)多进程SAPI生命周期

    通常PHP编译成Apache的一个模块,Apache通常采用多进程模式,Apache启动后会fork出多个子进程,每个进程的内存空间独立,每个子进程都会经过开始和结束环节,不过每个进程的开始阶段只在进程fork出来以后进行,在整个进程的生命周期内可能有可能处理多个请求。只有在Apache关闭或者进程被结束之后才进行关闭阶段,在这两个阶段会随着每个请求重复请求开始-请求关闭的环节

    (4)多线程模式和多进程中的某个进程类似,不同的是在整个进程的生命周期内会并行的重复着请求开始-请求关闭的环节。

    3、Zend引擎

    Zend引擎是PHP实现的核心,提供了语言实现上的基础设施。例如PHP语法的实现、脚本的编译运行环境、扩展机制以及内存管理等。这里的PHP指的是官方的PHP实现(另外还有facebook的Hiphop,现已发展成为HHVM,到目前为止(此项目)PHP还没有一个标准的语言规范),而PHP则提供了请求处理和其他Web服务器的接口(SAPI)

  • 相关阅读:
    PHP htmlspecialchars和htmlspecialchars_decode(函数)
    使用CURL抓取淘宝页面
    PHP 自定义字符串中的变量名解析
    Notepad++前端开发常用插件介绍
    使用phpExcel实现Excel数据的导入导出(完全步骤)
    moment.js 日期包装类 (说明示例)
    php函数前面加&符号 和 变量前面加&符号的意义
    window 查看端口/杀进程
    eureka 去除注册中心保护机制
    mysql 表关联更新另一张表的数据
  • 原文地址:https://www.cnblogs.com/orlion/p/5157273.html
Copyright © 2020-2023  润新知