概念
CGI
CGI是为了保证 web server 传递过来的数据是标准格式的,它是一个协议,方便CGI程序的编写者。可以针对用户请求动态返回给客户端各种各样动态变化的信息。
FastCGI
用来提高CGI程序性能。协议
PHP-FPM
PHP-FPM是一个PHP版本的实现了FastCGI协议的程序,用来管理FastCGI起的进程,实现PHP脚本与web服务器(通常是nginx)之间的通信。现已在PHP(>5.3.3)内核中就集成了PHP-FPM,使用 --enable-fmp 开启。
概念解释
web server(如nginx)只是内容的发布者。
如果请求的是 /index.html(静态资源),web server 会去文件系统中找到这个文件,发送给浏览器。
如果请求的是 /index.php ,根据配置文件,需要去找PHP解析器来处理。CGI规定了要传什么数据/以什么格式传输给PHP解析器的协议。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。
CGI针对每个http请求都是fork一个新进程来进行处理。
而FastCGI会先fork一个master进程,解析配置文件,初始化执行环境,再fork多个worker。当请求过来时,master会传递给一个worker,然后立即接受下一个请求。当worker不够用时,master可以根据配置预先启动几个worker等着;当空闲worker太多时,也会停掉一些。
大多数FastCGI实现都会维护一个进程池。
最大请求数:最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respwan一个新的。这个配置的主要目的是避免PHP解释器或程序引用的第三方库造成的内存泄漏。
pm.max_requests = 10240
使用
// todo:
