如何快速掌握PHP-FPM配置与运用技巧?

更新于
2026-09-27 18:57:00
1阅读来源:SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1380个文字,预计阅读时间需要6分钟。

如何快速掌握PHP-FPM配置与运用技巧?

我们学习了大量关于PHP的知识,但不确定大家对PHP-FPM的配置及使用总结是否完全掌握。若还未,那就跟随以下文章一起继续学习吧——PHP-FPM配置及使用总结:PHP-FPM是一个轻量级的PHP FastCGI管理器。

我们学习了解了这么多关于PHP的知识,不知道你们对PHP-FPM配置及使用总结是否已经完全掌握了呢,如果没有,那就跟随本篇文章一起继续学习吧

PHP-FPM配置及使用总结:

PHP-FPM是一个PHP FastCGI的管理器,它实际上就是PHP源代码的补丁,旨在将FastCGI进程管理引进到PHP软件包中,我们必须将其patch到PHP源代码中,然后再行编译才能使用。而现在我们可以在PHP 5.3.2及更新版本中直接开启并使用即可,因为PHP从该版本已经将其收入到软件包中,所以其不再是补丁包的存在了。

· 几个概念的理解

· Nginx+PHP配置

· Php-Fpm的操作

一、几个概念的理解

1)、CGI

CGI全称“公共网关接口”(Common Gateway Interface),是HTTP服务器与其它机器上的程序进行通信的接口,其程序须运行在网络服务器上。

NOTE:

CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。

2)、FastCGI

FastCGI是一个常驻型的CGI,它可以一直执行,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute模式)。它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。我们知道,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保存在内存中并接受FastCGI进程管理器调度,那么就可以提供良好的性能、伸缩性等。

优点:

1. FastCGI具有语言无关性;

2. FastCGI独立于核心web服务器运行,提供了一个比API更安全的环境。APIs把应用程序的代码与核心的web服务器链接在一起,这意味着在一个错误的API的应用程序可能会损坏其他应用程序或核心服务器。而恶意的API的应用程序代码甚至可以窃取另一个应用程序或核心服务器的密钥;

3. FastCGI技术目前支持语言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相关模块在Apache, ISS, Ligwww.ligwww.ligredmine.ligwww.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz。

NOTE:

最新的Spawn-FCGI可以到lighttpd.net网站搜索“Spawn-FCGI”找到它的最新版本发布地址。

5)、对比Spawn-FCGI

PHP-FPM的使用非常方便,配置都是在PHP-FPM.ini的文件内,而启动、重启都可以从php/sbin/PHP-FPM中进行。更方便的是修改php.ini后可以直接使用PHP-FPM reload进行加载,无需杀掉进程就可以完成php.ini的修改加载

结果显示使用PHP-FPM可以使php有不小的性能提升。PHP-FPM控制的进程cpu回收的速度比较慢,内存分配的很均匀。

Spawn-FCGI控制的进程CPU下降的很快,而内存分配的比较不均匀。有很多进程似乎未分配到,而另外一些却占用很高。可能是由于进程任务分配的不均匀导致的。而这也导致了总体响应速度的下降。而PHP-FPM合理的分配,导致总体响应的提到以及任务的平均。

二、Nginx+PHP配置

1、进程数优化

pm = dynamic

pm.max_children = 300

pm.start_servers = 20

pm.min_spare_servers = 5

pm.max_spare_servers = 35

2、最大请求数优化

pm.max_requests = 10240

NOTE:

这个用来处理因为PHP解析器或引用的第三方库时,造成的内存泄露问题。

最大请求数:指一个php-fpm的工作进程在处理多少个请求后就终止掉。

3、最长执行时间优化(php.ini)

request_terminate_timeout = 20

NOTE:

这个是用来处理因为PHP执行时间超长而报502错误的解决。

如何快速掌握PHP-FPM配置与运用技巧?

这个时长配置可以在php.ini(max_execution_time)或php-fpm.conf中配置均可,为了不影响全局配置,可在php-fpm.conf中实现。

值得注意的是:需要结合nginx.conf中的max_fail(调大些)和fail_timeout(调小些)一同配置。

nginx.conf:

location ~ \.php$ {

…

fastcgi_connect_timeout 180;

fastcgi_read_timeout 600;

fastcgi_send_timeout 600;

…

}

NOTE:

PHP-FPM设置的脚本最大执行时间已经够长了,但执行耗时PHP脚本时,发现Nginx报错变为504错误。这是因为我们修改的只是PHP的配置,Nginx中也有关于与上游服务器通信超时时间的配置factcgi_connect/read/send_timeout。

4、php-fpm高cpu使用排查

top命令 :

直接执行top命令后,输入1就可以看到各个核心的CPU使用率:


sar命令:

sar和iostat命令的安装:

sysstat.x86_64 : The sar and iostat systemmonitoring commands

yum install -y sysstat.x86_64

执行:

$sar -P ALL 1 100

NOTE:

-P ALL表示监控所有核心;

1表示每1秒采集;

100表示采集100次;

5、开启慢日志

slowlog = log/$pool.log.slow

request_slowlog_timeout = 2

NOTE:

上面为开启php-fpm的慢日志,时间阀值2秒;

执行:

grep -v "^$" php.slow.log | cut -d " " -f 3,2 | sort |uniq -c | sort -k1,1nr | head -n 50

NOTE:

sort: 对单词进行排序

uniq -c: 显示唯一的行,并在每行行首加上本行在文件中出现的次数

sort -k1,1nr: 按照第一个字段,数值排序,且为逆序

head –n 10: 取前10行数据

PS:

开启慢日志的目的是为了跟踪分析那条php脚本执行的时间超过了设置的request_slowlog_timeout时长,如果超过这个设置时间,那么该脚本就会被记录下。

三、Php-Fpm的操作

PHP5.3.3下的php-fpm 不再支持php-fpm 以前具有的 /usr/local/php/sbin/php-fpm(start|stop|reload)等命令,需要使用信号控制:

master进程可以理解以下信号

INT, TERM 立刻终止
;

QUIT 平滑终止
;

USR1 重新打开日志文件
;

USR2平滑重载所有worker进程并重新载入配置和二进制模块 ;

示例:


php-fpm 关闭:
kill -INT`cat /usr/local/php/var/run/php-fpm.pid`


php-fpm 重启:
kill -USR2`cat /usr/local/php/var/run/php-fpm.pid`

查看php-fpm进程数:

$ps aux | grep -c php-fpm

本文共计1380个文字,预计阅读时间需要6分钟。

如何快速掌握PHP-FPM配置与运用技巧?

我们学习了大量关于PHP的知识,但不确定大家对PHP-FPM的配置及使用总结是否完全掌握。若还未,那就跟随以下文章一起继续学习吧——PHP-FPM配置及使用总结:PHP-FPM是一个轻量级的PHP FastCGI管理器。

我们学习了解了这么多关于PHP的知识,不知道你们对PHP-FPM配置及使用总结是否已经完全掌握了呢,如果没有,那就跟随本篇文章一起继续学习吧

PHP-FPM配置及使用总结:

PHP-FPM是一个PHP FastCGI的管理器,它实际上就是PHP源代码的补丁,旨在将FastCGI进程管理引进到PHP软件包中,我们必须将其patch到PHP源代码中,然后再行编译才能使用。而现在我们可以在PHP 5.3.2及更新版本中直接开启并使用即可,因为PHP从该版本已经将其收入到软件包中,所以其不再是补丁包的存在了。

· 几个概念的理解

· Nginx+PHP配置

· Php-Fpm的操作

一、几个概念的理解

1)、CGI

CGI全称“公共网关接口”(Common Gateway Interface),是HTTP服务器与其它机器上的程序进行通信的接口,其程序须运行在网络服务器上。

NOTE:

CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。

2)、FastCGI

FastCGI是一个常驻型的CGI,它可以一直执行,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute模式)。它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。我们知道,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保存在内存中并接受FastCGI进程管理器调度,那么就可以提供良好的性能、伸缩性等。

优点:

1. FastCGI具有语言无关性;

2. FastCGI独立于核心web服务器运行,提供了一个比API更安全的环境。APIs把应用程序的代码与核心的web服务器链接在一起,这意味着在一个错误的API的应用程序可能会损坏其他应用程序或核心服务器。而恶意的API的应用程序代码甚至可以窃取另一个应用程序或核心服务器的密钥;

3. FastCGI技术目前支持语言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相关模块在Apache, ISS, Ligwww.ligwww.ligredmine.ligwww.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz。

NOTE:

最新的Spawn-FCGI可以到lighttpd.net网站搜索“Spawn-FCGI”找到它的最新版本发布地址。

5)、对比Spawn-FCGI

PHP-FPM的使用非常方便,配置都是在PHP-FPM.ini的文件内,而启动、重启都可以从php/sbin/PHP-FPM中进行。更方便的是修改php.ini后可以直接使用PHP-FPM reload进行加载,无需杀掉进程就可以完成php.ini的修改加载

结果显示使用PHP-FPM可以使php有不小的性能提升。PHP-FPM控制的进程cpu回收的速度比较慢,内存分配的很均匀。

Spawn-FCGI控制的进程CPU下降的很快,而内存分配的比较不均匀。有很多进程似乎未分配到,而另外一些却占用很高。可能是由于进程任务分配的不均匀导致的。而这也导致了总体响应速度的下降。而PHP-FPM合理的分配,导致总体响应的提到以及任务的平均。

二、Nginx+PHP配置

1、进程数优化

pm = dynamic

pm.max_children = 300

pm.start_servers = 20

pm.min_spare_servers = 5

pm.max_spare_servers = 35

2、最大请求数优化

pm.max_requests = 10240

NOTE:

这个用来处理因为PHP解析器或引用的第三方库时,造成的内存泄露问题。

最大请求数:指一个php-fpm的工作进程在处理多少个请求后就终止掉。

3、最长执行时间优化(php.ini)

request_terminate_timeout = 20

NOTE:

这个是用来处理因为PHP执行时间超长而报502错误的解决。

如何快速掌握PHP-FPM配置与运用技巧?

这个时长配置可以在php.ini(max_execution_time)或php-fpm.conf中配置均可,为了不影响全局配置,可在php-fpm.conf中实现。

值得注意的是:需要结合nginx.conf中的max_fail(调大些)和fail_timeout(调小些)一同配置。

nginx.conf:

location ~ \.php$ {

…

fastcgi_connect_timeout 180;

fastcgi_read_timeout 600;

fastcgi_send_timeout 600;

…

}

NOTE:

PHP-FPM设置的脚本最大执行时间已经够长了,但执行耗时PHP脚本时,发现Nginx报错变为504错误。这是因为我们修改的只是PHP的配置,Nginx中也有关于与上游服务器通信超时时间的配置factcgi_connect/read/send_timeout。

4、php-fpm高cpu使用排查

top命令 :

直接执行top命令后,输入1就可以看到各个核心的CPU使用率:


sar命令:

sar和iostat命令的安装:

sysstat.x86_64 : The sar and iostat systemmonitoring commands

yum install -y sysstat.x86_64

执行:

$sar -P ALL 1 100

NOTE:

-P ALL表示监控所有核心;

1表示每1秒采集;

100表示采集100次;

5、开启慢日志

slowlog = log/$pool.log.slow

request_slowlog_timeout = 2

NOTE:

上面为开启php-fpm的慢日志,时间阀值2秒;

执行:

grep -v "^$" php.slow.log | cut -d " " -f 3,2 | sort |uniq -c | sort -k1,1nr | head -n 50

NOTE:

sort: 对单词进行排序

uniq -c: 显示唯一的行,并在每行行首加上本行在文件中出现的次数

sort -k1,1nr: 按照第一个字段,数值排序,且为逆序

head –n 10: 取前10行数据

PS:

开启慢日志的目的是为了跟踪分析那条php脚本执行的时间超过了设置的request_slowlog_timeout时长,如果超过这个设置时间,那么该脚本就会被记录下。

三、Php-Fpm的操作

PHP5.3.3下的php-fpm 不再支持php-fpm 以前具有的 /usr/local/php/sbin/php-fpm(start|stop|reload)等命令,需要使用信号控制:

master进程可以理解以下信号

INT, TERM 立刻终止
;

QUIT 平滑终止
;

USR1 重新打开日志文件
;

USR2平滑重载所有worker进程并重新载入配置和二进制模块 ;

示例:


php-fpm 关闭:
kill -INT`cat /usr/local/php/var/run/php-fpm.pid`


php-fpm 重启:
kill -USR2`cat /usr/local/php/var/run/php-fpm.pid`

查看php-fpm进程数:

$ps aux | grep -c php-fpm