cgi、fast-cgi、php-cgi以及php-fpm之间的联系

之前就一直没弄明白cgi、fast-cgi、php-cgi和php-fpm他们之间的联系,现在来梳理一下。

基本概念

  • cgi:全称为Common Gateway Interface(公共网关接口),保证了从浏览器传递到PHP程序的数据的标准格式。简单来说就是规定了浏览器、前端服务器(比如nginx)以及PHP程序之间通信的数据格式,称之为通信接口协议。
  • fsat-cgi:对cgi协议的改进,使得通信更加高效。
  • php-cgi:php提供给web server也就是http前端服务器的cgi协议的接口程序。
  • php-fpm:php提供给web server也就是http前端服务器的fast-cgi协议的接口程序。这里php-fpm扮演一个进程管理的角色,管理处理请求的进程。

在明白了这些概念之后我们就可以来讨论他们之间的关系了。首先我们应该知道整个请求的流程。浏览器发送的请求不是直接到达php程序,而是先到达web server也就是前端服务器(以nginx为例)由web server处理后才发送给php程序,但是php程序不认识web server发送的请求,而web server也不能识别php的相应代码,所以就需要一个协议来转换他们之间的数据,使得都能够识别对方。这便是cgi协议的作用。

有了cgi、php-cgi为什么还要fast-cgi、php-fpm?

  • 在最开始是没有fast-cgi协议的,使用fast-cgi协议是因为cgi协议在每次连接请求时,会创建一个进程处理请求,去读取php.ini里的基础配置信息,初始化执行环境返回数据之后退出进程。每当有一个新的请求连接都会重复此过程,因此有多少个连接就有多少个cgi进程,过多的进程消耗资源和内存增多,这也就是为什么传统的cgi协议会显得缓慢的原因。而fast-cgi协议则是一个进程可以处理多个请求,和上面的cgi协议完全不一样。
  • php-cgi就是处理请求的进程,每当一个新的请求连接就会创建一个php-cgi进程并执行初始化操作,结束之后退出,显然资源消耗高、效率低下。php-fpm则创建一个主进程(master)和多个工作进程(worker),由这个主进程去读取php.ini里的基础配置信息,初始化执行环境。当有请求连接时主进程将配置信息发送给一个工作进程,由该工作进程来处理请求,这时如果又来一个请求,那么主进程就配置另外一个工作进程,并由该工作进程来处理请求。我们可以看到,这样就大大降低了内存与资源的消耗,提高效率。
  • 由上可知fast-cgi和php-fpm组合可以减少处理请求使得内存与资源的消耗,而php-fpm并没有去处理请求,而是起到了一个进程管理的作用,他会管理工作进程(php-cgi)处理请求,而在请求完成后也不会停止工作进程,而是让其等待下一个请求。另外,在php配置更新后也不需要重启,php-fpm有平滑过渡配置更改功能,普通的php-cgi在每次更改配置后,需要重新启动才能初始化新的配置,而php-fpm是不需要的,php-fpm会将新的连接发送给新的子程序php-cgi,这个时候加载的是新的配置,而原先正在运行的php-cgi还是使用的原先的配置,等到这个连接后下一次连接的时候会使用新的配置初始化。
发布了61 篇原创文章 · 获赞 67 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章