php 前后端分离-PHP和NGINX如何工作

1. 什么是CGICGI是

为了确保Web服务器传输的数据是标准格式,这对于CGI程序编写者来说很方便。Web服务器(如nginx)只是内容的分发者。例如,如果您请求 /index.html,Web 服务器将转到文件系统并找到文件并将其发送到浏览器,在那里数据仍然分布。好吧,如果当前的请求是 /index.php,根据配置文件,nginx 知道这不是一个静态文件,需要去 PHP 解析器,那么他会简单地处理这个请求并将其交给 PHP 解析器。Nginx向PHP解析器发送哪些数据?URL必须在那里,查询字符串也必须在那里,POST数据也必须在那里,HTTP头不能少,好吧,CGI就是规定要传输什么数据,以什么格式传递给后面来处理这个诉状合同。想想你在PHP代码中使用的用户来自哪里。

当 Web 服务器收到 /index.php 请求时,它将启动相应的 CGI 程序,即 PHP 解析器。接下来,PHP 解析器解析 PHP .ini文件,初始化执行环境,处理请求,以 CGI 指定的格式返回处理后的结果,然后退出进程。Web 服务器将结果返回到浏览器。

二、什么是快速CGI

FastCGI是一个可扩展的高速出口,用于HTTP服务器和动态脚本语言之间的通信。大多数流行的HTTP服务器都支持FastCGI,包括Apache,Nginx和lighttpd,许多脚本语言也支持FastCGI,包括PHP。

FastCGI是CGI开发的改进。传统CGI接口的主要缺点是性能差,因为每次HTTP服务器遇到动态程序时,都要重启脚本解析器进行解析,然后将结果返回给HTTP服务器。这在处理高并发访问时几乎无法使用。此外,传统的CGI套接字形式也非常安全,长期以来很少使用。

前后端分离代码_php前后端不分离_php 前后端分离

FastCGI用于增强CGI程序的性能php 前后端分离,那么CGI程序的性能问题是什么?“PHP 解析器解析 PHP .ini文件并初始化执行环境”,就是这样。标准 CGI 为每个请求方执行此步骤,因此每次处理时间更长。这显然是不合理的!那么FastCGI是如何做到的呢?首先,FastCGI 启动一个主节点,解析配置文件php 前后端分离,初始化执行环境,然后启动多个工作线程。当请求到来时,主人将其传递给工人并立即接受下一个请求。这样,避免了重复性工作,效率自然很高。当没有足够的工人时,主人可以根据配置预先启动几个工人并等待;当然,当空闲工人过多时,会停止一些工作线程,从而提高性能并节省资源。这就是fastcgi对流程的管理。

众所周知,PHP 库是 php-cgi.php-CGI 只是一个 CGI 程序,它本身只能解析诉状,返回结果,不会管理进程,所以有一些程序可以调度 php-CGI 进程,比如 spawn-fcgi 用 lighthttpd 分隔。嗯,PHP-FPM 也是一件好事,经过长时间的发展,它逐渐被你认可了(你知道,前几年你指责 PHP-FPM 稳定性差),并且越来越受欢迎。

三、Nginx + FastCGI的工作原理

php前后端不分离_php 前后端分离_前后端分离代码

FastCGI 套接字采用 C/S 结构,可以将 HTTP 服务器与脚本解析服务器分离,同时在脚本解析服务器上启动一个或多个脚本解析守护进程。每次HTTP服务器遇到动态程序时,都可以将其直接交付给FastCGI进程执行,然后将结果返回给浏览器。这种方式允许 HTTP 服务器独占处理静态请求或将动态脚本服务器的结果返回给客户端,大大提高了整个应用系统的性能。

Nginx不支持直接调用或解析外部程序,所有外部程序(包括PHP)都必须通过FastCGI接口调用。FastCGI 接口是 Linux 下的套接字(此套接字可以是文件套接字或 ip 套接字)。为了调用CGI程序,还需要一个FastCGI包装器(包装器可以理解为用于启动另一个程序的程序),它绑定到固定的套接字,例如端口或文件套接字。当 Nginx 通过 FastCGI 接口向这个套接字发送 CGI 请求时,包装器接受请求,然后生成一个新线程,该线程调用例程或外部程序来处理脚本并读取返回的数据;然后,包装器通过 FastCGI 接口将返回的数据沿着固定套接字传递给 Nginx。最后,Nginx将返回的数据发送到客户端,这就是Nginx + FastCGI的工作方式。具体流程如图1所示。

前后端分离代码_php 前后端分离_php前后端不分离

NGINX 和 PHP-FPM

如前所述,FastCGI

接口方法在脚本解析服务器上启动一个或多个守护进程来解析动态脚本,这些进程是FastCGI进程管理器,或者说是FastCGI引擎,PHP-FPM是支持PHP的进程管理器,fastCGI是合约,php-fpm实现这个合约。

Nginx是一个轻量级的HTTP服务器,依靠第三方FastCGI处理器来解析PHP。

PHP-FPM 是第三方 FastCGI 进程管理器,是作为 PHP 的补丁开发的,安装时必须用 PHP 源代码编译,这意味着 PHP-FPM 编译到 PHP 内核中,在处理性能方面越来越好;因此,建议组合使用 Nginx+PHP/PHP-FPM 解析 PHP(PHP-FPM 可以在 ./configure 时启用 -enable-fpm 参数)。

FastCGI的主要优点是它将动态语言与HTTP服务器分开,因此Nginx和PHP/PHP-FPM

经常部署在不同的服务器上,分担后端 Nginx 服务器的压力,这样 Nginx 处理静态请求方和转发动态请求,而 PHP/PHP-FPM 服务器专门解析 PHP 动态请求。