好久之前,人们造出来一个机器人,它的英文名字叫web server,中文名叫网页服务器。(为了简写,下文称web server为server)php
server的工做很简单,就是作内容的分发。html
初期的sever功能很简单,只能处理静态请求,当客户端请求/index.html的时候,server去文件系统里面找到对应的index.html文件,而后返回给客户端,这个时期的server就像一个仓库管理员,别人要啥,他给啥。java
但是这样的机器人很明显不能知足人们的需求,由于sever机器人只能处理静态请求,却不能处理动态请求,如/index.php或者/index.java,这就好像它是服务员,只能端出作好的红烧肉,却不能本身作出红烧肉。nginx
为了可以让server机器人处理动态请求(作出红烧肉),聪明的人类开始了他们的发明,因而他们在server机器人的肚子上挖出了一个长方形的洞,取名叫作接口,这个接口上只要插入制做红烧肉的智能芯片,server机器就能作红烧肉,插入制做烤鱼的芯片,server机器就能作烤鱼。web
为了体现专业性,人们给sever机器人肚子上面的洞,这个接口,取了一个高大上的名字,叫作CGI(全称是是Command Gateway Interface,一般翻译为公共网关接口),经过这个接口,其余的应用程序能够与server机器人进行交互。浏览器
制做红烧肉的芯片,叫作php解析器。服务器
制做红烧肉的芯片,叫作java解析器。php-fpm
固然,与server进行交互的应用程序除了php解析器,java解析器,还有不少。post
综上,sever主要工做内容:性能
(1)处理静态请求,当客户端请求静态文件的时候,如/a.html,web server会去文件系统中找到a.html这个文件,发送给浏览器。
(2)处理动态请求,当客户端请求/a.php的时候,web server会根据本身的配置文件(http.conf或者nginx.conf)得知,该请求的是动态数据,因而web server须要把请求交给PHP解析器(php-cgi)来处理,webserver与php通讯须要遵循cgi接口定义的协议,将url地址,header消息头,post/get数据等一系列内容按照必定的格式传给php解析器(即php-cgi)处理,php解析器处理完成以后返回给web server,最后web server接到结果返回给客户端。
好景不长,问题来了
CGI接口的出现,让server可以处理动态请求,让server的功能有另外一个飞跃。
天天,客户端与server就这样不断的循环往复:
(1)客户端发送请求给sever
(2)server接收请求和数据
(3)server会fork一个进程来启动对应的CGI程序(这里主要是php-cgi,PHP的解释器是php-cgi)
(4)php-cgi会解析php.ini文件,初始化执行环境,并处理请求,解析CGI接口传来的数据
(5)php-cgi以CGI接口规定的格式返回server处理后的结果
(6)server将结果返回客户端。
但是,好景不长,一心追求完美的人类,发现了一个问题。
每次客户端发起新的请求,server端都会fork一个进程出来启动php-cgi,而php-cgi却又每次都会进行一次初始化的工做(解析php.ini文件,初始化执行环境),人们以为这样的重复实在效率过低,不只很消耗时间,还很耗资源,因而想出来一个新的方案。
新的方案来临,FASTCGI的诞生
FASTCGI和CGI同样也是接口,是CGI的升级方案。
当server启动的时候,fastcgi会先启一个master进程(这里是php-fpm,主要用来管理php-cgi),解析php.ini,初始化执行环境,而后再启动多个worker(php-cgi)。当请求过来时,master会传递给一个worker(php-cgi),而后当即能够接受下一个请求,同时,当worker不够用时,master能够根据配置预先启动几个worker等着;固然空闲worker太多时,也会停掉一些。
这种fastcgi对进程的管理,避免了重复的劳动,提升了性能,缩短了处理的时间,节省了资源,也就成为了目前主流的通讯交互方式。