浏览器发送请求数据并接收返回数据的过程

CGI

  • CGI(Common Gateway Interface),全称是通用网关接口
  • 运行在网络服务器上
  • 是 Web 服务器与 PHP 应用进行“交谈”的一种工具,规定了要传什么数据、以什么格式传递给 PHP 解析器
  • 缺陷:每一次 Web 请求都会有启动和退出过程(fork-and-execute 模式),CGI 解释器的反复加载是CGI性能低下的主要原因

FastCGI

  • 用来提高 CGI 程序性能
  • 像是常驻(long-live)型的 CGI,将 CGI 解释器进程保持在内存中。它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一次

工作原理

  1. Web Server 启动时载入 FastCGI 进程管理器
  2. FastCGI 进程管理器自身初始化,启动多个 CGI 解释器进程,等待来自 Web Server 的连接
  3. 当客户端请求到达 Web Server 时,FastCGI 进程管理器选择并连接到一个 CGI 解释器
  4. Web Server 将 CGI 环境变量和标准输入发送到 FastCGI 子进程 php-cgi
  5. FastCGI 子进程完成处理后将标准输出和错误信息从同一连接返回 Web Server

FastCGI 工作原理

PHP-CGI

  • PHP 实现的自带的 FastCGI 管理器,能够调度 PHP-CGI 进程
  • 缺陷:
    1. 变更 php.ini 配置后,需重启 PHP-CGI 才能让新的 php.ini 生效,不可以平滑重启
    2. 直接杀死 PHP-CGI 进程,PHP 就不能运行了

PHP-FPM

  • 对于 FastCGI 协议的具体实现,负责管理一个进程池,来处理来自 Web 服务器的请求
  • 克服 PHP-CGI 的缺陷,通过生成新的子进程可以实现 php.ini 修改后的平滑重启

参考资料