本文主要讲解Nginx和PHP-FPM之间的运行机制和交互过程。在深入讲解之前,需要先介绍CGI、FastCGI、PHP-CGI、PHP-FPM之间的关系。
什么是CGI?
最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html。事物总是不 断发展,网站也越来越复杂,所以出现动态技术。但是服务器并不能直接运行 php,asp这样的文件,自己不能做,外包给别人吧,但是要与第三做个约定,我给你什么,然后你给我什么,就是握把请求参数发送给你,然后我接收你的处 理结果给客户端。那这个约定就是 common gateway interface,简称cgi。这个协议可以用vb,c,php,python 来实现。cgi只是接口协议,根本不是什么语言。
CGI工作原理:
每当客户请求CGI的时候,WEB服务器就请求操作系统生成一个新的CGI解释器进程(如php-cgi.exe),CGI 的一个进程则处理完一个请求后退出,下一个请求来时再创建新进程。当然,这样在访问量很少没有并发的情况也行。可是当访问量增大,并发存在,这种方式就不 适合了。于是就有了fastcgi。
什么是FastCGI?
FastCGI相比于CGI,它更像是一个常驻性的CGI程序,即它将CGI解释器进程一直保持在内存中运行。它可以一直运行着,不会每次收到web请求都去创建新的进程处理然后再销毁,从而获得较高的性能。
FastCGI的重要特点:
- 1、FastCGI是HTTP服务器和动态脚本语言间通信的接口或者工具。
- 2、FastCGI优点是把动态语言解析和HTTP服务器分离开来。
- 3、Nginx、Apache、Lighttpd以及多数动态语言都支持FastCGI。
- 4、FastCGI接口方式采用C/S架构,分为客户端(HTTP服务器)和服务端(动态语言解析服务器)。
- 5、PHP动态语言服务端可以启动多个FastCGI的守护进程。
- 6、HTTP服务器通过FastCGI客户端和动态语言FastCGI服务端通信。
FastCGI的运行过程:
- 1、Web Server启动时载入FastCGI进程管理器(Apache Module或IIS ISAPI等)
- 2、FastCGI会先启一个master,解析配置文件,初始化执行环境,然后启动多个CGI解释器进程(php-cgi,即worker),并等待来自Web Server的连接。
- 3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器(即分配给一个worker)。然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。
- 4、FastCGI子进程完成处理后,将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待,并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 (在CGI模式中,php-cgi在此便退出了)
什么是php-fpm?
php-fpm是PHP内置的一个FastCGI 进程管理器。是一种master(主)/worker(子)多进程架构,与nginx设计风格有点类似。master进程主要负责CGI及PHP环境初始化、事件监听、子进程状态等等,worker进程负责处理php请求。
php-fpm会在下一章再详细介绍。
