201411-07 PHP内核探索 —— 从SAPI接口开始 SAPI:ServerApplicationProgrammingInterface服务器端应用编程端口。研究过PHP架构的同学应该知道这个东东的重要性,它提供了一个接口,使得PHP可以和其他应用进行交互数据。本文不会详细介绍每个PHP的SAPI,只是针对最简单的CGISAPI,来说明SAPI的机制。我们先来看看PHP的架构图:SAPI指的是PHP具体应用的编程接口,就像PC一样,无论安装哪些操作系统,只要满足了PC的接口规范都可以在PC上正常运行,PHP脚本要执行有... 继续阅读 >
201411-07 PHP内核探索 —— 一次请求的开始与结束:MINIT和RINIT、RSHUTDOWN和MSHUTDOWN PHP开始执行以后会经过两个主要的阶段:处理请求之前的开始阶段请求之后的结束阶段开始阶段有两个过程:第一个过程是模块初始化阶段(MINIT),在整个SAPI生命周期内(例如Apache启动以后的整个生命周期内或者命令行程序整个执行过程中),该过程只进行一次。第二个过程是模块激活阶段(RINIT),该过程发生在请求阶段,例如通过url请求某个页面,则在每次请求之前都会进行模块激活(RINIT请求开始)。例如PHP注册了一... 继续阅读 >
201411-07 PHP内核探索 —— 一次请求生命周期:PHP的启动与关闭 我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的。PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口)。PHP总共有三个模块:内核、Zend引擎、以及扩展层。PHP内核用来处理请求、文件流、错误处理等相关操作;Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接... 继续阅读 >
201411-07 PHP内核探索 —— 单进程和多进程/线程SAPI生命周期 单进程SAPI生命周期CLI/CGI模式的PHP属于单进程的SAPI模式。这类的请求在处理一次请求后就关闭。也就是只会经过如下几个环节:开始-请求开始-请求关闭-结束SAPI接口实现就完成了其生命周期。单进程多请求则如下图所示:多进程SAPI生命周期通常PHP是编译为apache的一个模块来处理PHP请求。Apache一般会采用多进程模式,Apache启动后会fork出多个子进程,每个进程的内存空间独立,每个子进程都会经过开始和结束环节... 继续阅读 >
201411-07 PHP内核探索 —— 再次探讨SAPI 在PHP的生命周期的各个阶段,一些与服务相关的操作都是通过SAPI接口实现。这些内置实现的物理位置在PHP源码的SAPI目录。这个目录存放了PHP对各个服务器抽象层的代码,例如命令行程序的实现,Apache的mod_php5模块实现以及fastcgi的实现等等。在各个服务器抽象层之间遵守着相同的约定,这里我们称之为SAPI接口。每个SAPI实现都是一个_sapi_module_struct结构体变量。(SAPI接口)。在PHP的源码中,当需要调用服务器相关信息时... 继续阅读 >
201411-07 PHP内核探索 —— 通过mod_php5支持PHP Apache对PHP的支持是通过Apache的模块mod_php5来支持的。如果希望Apache支持PHP的话,在./configure步骤需要指定--with-apxs2=/usr/local/apache2/bin/apxs 表示告诉编译器通过Apache的mod_php5/apxs来提供对PHP5的解析。在最后一步makeinstall的时候我们会看到将动态链接库libphp5.so(Apache模块)拷贝到apache2的安装目录的modules目录下,并且还需要在httpd.conf配置文件中添加LoadModule语句来动态将libphp5.so 模块加载进... 继续阅读 >
201411-07 PHP内核探索 —— 嵌入式PHP:类似CLI 从PHP源码目录结构的介绍以及PHP生命周期可知:嵌入式PHP类似CLI,也是SAPI接口的另一种实现。一般情况下,它的一个请求的生命周期也会和其它的SAPI一样:模块初始化=>请求初始化=>处理请求=>关闭请求=>关闭模块。当然,这只是理想情况。因为特定的应用由自己特殊的需求,只是在处理PHP脚本这个环节基本一致。对于嵌入式PHP或许我们了解比较少,或者说根本用不到,甚至在网上相关的资料也不多,例如很多游戏中使用Lua语言作为... 继续阅读 >