
当用户代码输入给PHP内核去执行的时候,PHP内核会对PHP代码进行词法分析和语法分析,词法分析是把PHP代码分割成一个个的“单元”(TOKEN),语法分析则将这些“单元”转化为Zend Engine可执行的 *** 作。然后PHP内部的Zend Engine对这些 *** 作进行顺次的执行。Zend Engine是PHP内核的核心部分,负责最终 *** 作的执行和结果的返回,可以理解成为PHP内核中的“发动机”。
于是PHP代码的执行过程可以简单描述为下图:
二、SAPI接口Server Application Programming Interface (SAPI) 是应用程序接口,对于 PHP 语言来说,它提供了很多 SAPI 接口,有了 SAPI,PHP 才有实际的用武之处。PHP 中最重要的 SAPI 是 PHP-FPM,提供给 Nginx Web 服务器使用,换句话说,有了应用语言的 SAPI,才能扩展 Web 服务器的功能。
参考:什么是SAPI,FastCGI,PHP-FPM?学习PHP的必备知识
单进程SAPI生命周期
初始化若干全局变量
↓
初始化若干常量
↓
初始化Zend引擎和核心组件
↓
解析php.ini
↓
全局 *** 作函数的初始化
↓
初始化静态构建的模块和共享模块(MINIT)
模块初始化会执行两个 *** 作:1. 将这些模块注册到已注册模块列表(module_registry),如果注册的模块已经注册过了,PHP会报Module XXX already loaded的错误。1. 将每个模块中包含的函数注册到函数表( CG(function_table) ),如果函数无法添加,则会报 Unable to register functions, unable to load。
↓
禁用函数和类
↓
激活SAPI
↓
模块请求初始化、模块请求初始化
↓
运行
↓
结束
↓
flush结果输出
↓
关闭Zend引擎
三、FastCGICGI全称是“通用网关接口”(Common Gateway Interface),它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据。
1,CGI运行方式
客户端访问某个 URL 地址之后,通过 GET/POST/PUT 等方式提交数据,并通过 HTTP 协议向 Web 服务器发出请求。服务器端的 HTTP Daemon(守护进程)启动一个子进程。然后在子进程中,将 HTTP 请求里描述的信息通过标准输入 stdin 和环境变量传递给 URL 指定的 CGI 程序,并启动此应用程序进行处理,处理结果通过标准输出 stdout 返回给 HTTP Daemon 子进程。再由 HTTP Daemon 子进程通过 HTTP 协议返回给客户端。上面的这段话理解可能还是比较抽象,下面我们就通过一次 GET 请求为例进行详细说明。
2,FastCGI
可以先看看 FastCGI协议简介
FastCGI 进程管理器自身初始化,启动多个 CGI 解释器进程,并等待来自 Web Server 的连接。Web 服务器与 FastCGI 进程管理器进行 Socket 通信,通过 FastCGI 协议发送 CGI 环境变量和标准输入数据给 CGI 解释器进程。CGI 解释器进程完成处理后将标准输出和错误信息从同一连接返回 Web Server。CGI 解释器进程接着等待并处理来自 Web Server 的下一个连接。3,PHP的FastCGI管理器
PHP的CGI实现了FastCGI协议,是一个TCP或UDP协议的服务器接受来自Web服务器的请求,当启动时创建TCP/UDP协议的服务器的socket监听,并接收相关请求进行处理。随后就进入了PHP的生命周期:模块初始化,sapi初始化,处理PHP请求,模块关闭,sapi关闭等就构成了整个CGI的生命周期。
以TCP为例,在TCP的服务端,一般会执行这样几个 *** 作步骤:
调用socket函数创建一个TCP用的流式套接字;调用bind函数将服务器的本地地址与前面创建的套接字绑定;调用listen函数将新创建的套接字作为监听,等待客户端发起的连接,当客户端有多个连接连接到这个套接字时,可能需要排队处理;服务器进程调用accept函数进入阻塞状态,直到有客户进程调用connect函数而建立起一个连接;当与客户端创建连接后,服务器调用read_stream函数读取客户的请求;处理完数据后,服务器调用write函数向客户端发送应答。欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)