php内核学习笔记(一,运行方式)

一、用户代码的执行

当用户代码输入给PHP内核去执行的时候,PHP内核会对PHP代码进行词法分析和语法分析,词法分析是把PHP代码分割成一个个的“单元”(TOKEN),语法分析则将这些“单元”转化为Zend Engine可执行的操作。然后PHP内部的Zend Engine对这些操作进行顺次的执行。Zend Engine是PHP内核的核心部分,负责最终操作的执行和结果的返回,可以理解成为PHP内核中的“发动机”。

于是PHP代码的执行过程可以简单描述为下图:

单进程SAPI生命周期

二、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引擎

三、FastCGI

CGI全称是“通用网关接口”(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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值