本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/88php
关于网关的理解,一句话就是:做为一种翻译器,抽象出了一种可以到达资源的方法。git
这里指的经过翻译器来到达资源,能够包括经过转换协议(HTTP/FTP)获取网关另外一端与客户端使用不一样协议的服务器的资源,也能够包括经过网关向数据库发送查询语句来获取动态数据,也能够包括经过网关与不一样的网络进行通讯。总之就是经过网关获取资源。github
理解了网关的宏观概念以后,咱们看一下网关的分类:数据库
以上的网关都是链接客户端和服务器端的网关,即网关位于服务器和客户端的中间。还有一种经常使用的网关,应用程序服务器,会将目标服务器与网关结合在一个服务器中实现。好比客户端经过HTTP链接服务器,服务器将请求再经过一个网关应用编程接口发送给运行在服务器上的应用程序。编程
第一个流行的的应用程序网关API就是通用网关接口(Common Gateway Interface,CGI)。CGI是一个标准接口集。好比服务器须要请求网关的资源时,会将所须要的数据传递给它(一般是整条请求,包括url、查询字符串、HTTP请求的header等)。以后网关向服务器返回响应数据,服务器再将数据返回给Client。安全
因此,CGI的本质是:一个协议,包括了输入请求,转交,响应。服务器
可是CGI有一个明显的问题:为每条CGI请求引起一个新进程,这样的开销会限制那些使用CGI服务器的性能。因此出现了一种新型CGI——fastcgi。网络
Fastcgi接口模拟了CGI,可是是以持久守护进程运行的。首先,Fastcgi会先启一个master,解析配置文件,初始化执行环境,而后再启动多个worker。当请求过来时,master会传递给一个worker,而后当即能够接受下一个请求。php-fpm
上面说的cgi与fastcgi都是协议,与特定语言无关的。性能
那么php-cgi是什么?网上主要有2种说法:
我的理解的是:php-cgi是php自带的fastcgi管理器,管理的进程名称是php-cgi,应该是凑巧名字同样吧。
可是php-cgi的不足是:
综上,诞生了php-fpm,也是一个实现了fastcgi协议的程序。PHP-FPM提供了更好的PHP进程管理方式,能够有效控制内存和进程、能够平滑重载PHP配置。
参考资料:如何通俗地解释 CGI、FastCGI、php-fpm 之间的关系?
概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM HTTP权威指南8.1 8.2 8.3