PHP-FPM(PHP FastCGI Process Manager)
FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。
PHP-FPM的主要功能:
-
支持平滑停止/启动的高级进程管理功能;
-
可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的设置);
-
stdout 和 stderr 日志记录;
-
在发生意外情况的时候能够重新启动并缓存被破坏的 opcode;
-
文件上传优化支持;
-
"慢日志" - 记录脚本(不仅记录文件名,还记录 PHP backtrace 信息,可以使用 ptrace或者类似工具读取和分析远程进程的运行数据)运行所导致的异常缓慢;
-
fastcgi_finish_request() - 特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工作(录入视频转换、统计处理等);
-
动态/静态子进程产生;
-
基本 SAPI 运行状态信息(类似Apache的 mod_status);
-
基于 php.ini 的配置文件。
这是PHP手册上对FPM的解释,通俗点就一句话,PHP-FPM是FastCGI进程管理器。那么问题来了,什么是FastCGI呢?
要了解FastCGI,还要引入一个CGI的概念。
公共网关接口(Common Gateway Interface,CGI)是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。
早期的Web服务器,只能响应浏览器发来的HTTP静态资源的请求,并将存储在服务器中的静态资源返回给浏览器。随着Web技术的发展,逐渐出现了动态技术,但是Web服务器并不能够直接运行动态脚本,为了解决Web服务器与外部应用程序之间数据互通,于是出现了CGI(Common Gateway Interface)通用网关接口。
FastCGI,从命名也可以看出,它是CGI的升级版~
事实上,FastCGI确实是为了提升CGI的性能而生的。从上面的描述中,我们可以看出,CGI的工作原理是:每来一个请求都会去重新fork一个进程,读取php.ini配置,初始化环境,返回数据,退出进程。每次都会重复这些进程。随着业务的升级和web环境的革新,请求会越来越多,这种方式显然是效率很低的,所以FastCGI就应运而生~
FastCGI 的工作原理是先 fork 一个 master 进程,解析配置文件,初始化执行环境,然后再 fork 多个 worker 进程,当 HTTP 请求过来时,master 进程将其会传递给一个 worker 进程,然后立即可以接受下一个请求,这样就避免了重复的初始化操作,效率自然也就提高了。而且当 worker 进程不够用时,master 进程还可以根据配置预先启动几个 worker 进程等着;当空闲 worker 进程太多时,也会关掉一些,这样不仅提高了性能,还节约了系统资源。
CGI和FastCGI 只是一个协议规范,需要每个语言具体去实现,PHP-FPM 就是 PHP 版本的 FastCGI 协议实现,有了它,就是实现 PHP 脚本与 Web 服务器(通常是 Nginx)之间的通信。
概念解释
最大请求数:最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn一个新的。
这个配置的主要目的是避免php解释器或程序引用的第三方库造成的内存泄露。
pm.max_requests = 10240