目录
1、php中fastcgi和php-fpm是什么东西
先说说web服务器
mod_php模式
mod_fastcgi模式
图形表示一下这2种模式
mod_php 模式
mod_fastcgi 模式
php-fpm
2、php-fpm的安装和启动
安装 php-fpm
启动 php-fpm
开机启动 php-fpm
重启 php-fpm
3、php-fpm的配置和优化
php-fpm的安装目录
centos等linux平台
mac平台
php-fpm配置详解
一些重要的设置
php-fpm进程分配
pm = static 模式
pm = dynamic 模式
到底选择static还数dynamic?
慢日志查询
首页 后端开发 PHP问题 php-fpm的安装路径是什么?

php-fpm的安装路径是什么?

Sep 25, 2020 pm 04:00 PM
php php-fpm

php-fpm的安装路径:1、在centos等linux平台中是“/usr/local/php/etc/”和“/usr/local/php/sbin/”目录下;2、mac平台中是“/etc/”和“/usr/bin/”目录下。

php-fpm的安装路径是什么?

1、php中fastcgi和php-fpm是什么东西

最近在研究和学习php的性能方面的知识,看到了factcgi以及php-fpm,发现我对他们是少之又少的理解,可以说几乎是一无所知,想想还是蛮可怕的。决定仔细的学习一下关于这方面的知识。

参考和学习了以下文章:
1.  mod_php和mod_fastcgi和php-fpm的介绍,对比,和性能数据
2.  实战Nginx_取代

为了如何一步步的引出fastcgi和php-fpm,我先一点一点的说说关于php的周边。哎。突然觉得人活着好累!

先说说web服务器

php是为web而生的一门后端语言,我们php狗当然是最清楚的啦。所以php仅仅是一门后端语言,那么它就必须借助于web服务器,才能提供web功能。当然其他的后端语言如果做web应用,也必须借助于web服务器。好,由php引出了web服务器,不错!

那么常见的web服务器有哪些呢?php狗用的最多的就是Apache了,还有其他的:

  • apache
  • nginx
  • IIS
  • lighttpd
  • tomcat

基本上就是上面几种,与php相关联起来用的最多的就是Apache和Nginx了。

我们先举例用apache当作web服务器,来说明一次完整的php访问的情况: 

1.jpg

图片中就很好的解释了php与Apache结合mysql数据库的一次完成的web访问流程图

mod_php模式

上面讲清楚了php必须借助于web服务器才能提供web的功能服务,现在看下他俩是怎么成为基友的。

我们用到的最多的就是Apache了。那么回忆一下,如何使apache是怎么能够识别php代码的?是不是apache的配置文件httpd.conf中加上或者修改这样几句:

//加入以下2句
LoadModule php5_module D:/php/php5apache2_2.dll
AddType application/x-httpd-php .php

//将下面的
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
//将其修改为:
<IfModule dir_module>
    DirectoryIndex index.html index.htm index.php index.phtml
</IfModule>
登录后复制

上面的windows下安装php和apache环境后的手动配置,在linux下源码安装大致是这样配置的:

./configure --with-mysql=/usr/local --with-apache=/usr/local/apache --enable-track-vars
登录后复制

所以,这种方式,他们的共同本质都是用LoadModule来加载php5_module,就是把php作为apache的一个子模块来运行。当通过web访问php文件时,apache就会调用php5_module来解析php代码。

那么php5_module是怎么来将数据传给php解析器来解析php代码的呢?

答案是通过sapi

我们再来看一张图,详细的说说apache 与 php 与 sapi的关系:

2.jpg

从上面图中,我们看出了sapi就是这样的一个中间过程,SAPI提供了一个和外部通信的接口,有点类似于socket,使得PHP可以和其他应用进行交互数据(apache,nginx,cli等)。php默认提供了很多种SAPI,常见的给apache和nginx的php5_module,CGI,给IIS的ISAPI,还有Shell的CLI。

所以,以上的apache调用php执行的过程如下:

apache -> httpd -> php5_module -> sapi -> php
登录后复制

好了。apache与php通过php5_module的方式就搞清楚了吧!

我们把这种运行方式叫做mod_php模式

mod_fastcgi模式

上面我们仔细说了php与apache通过php5_module,php5_module通过sapi的方式访问php,来达到php web的整个流程。

上面也说到了sapi,sapi是php提供的统一接口,它提供给了php5_module和cgi等方式供web服务器来链接和解析php代码。上面讲到的php5_module加载模式,我们称之为mod_php模式。

那么!当当当当!马上就要说出fastcgi模式了。哈哈哈哈哈,太不容了。

那么php的sapi的另一种方式就是提供cgi模式,由于cgi比较老所以就出现了fastcgi来取代它。

所以,哎。没办法,又要说什么是CGI了?

CGI(Common Gateway Interface)。CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。

看官方的解释就蛋疼,简单的说,就是:cgi就是专门用来和web 服务器打交道的。web服务器收到用户请求,就会把请求提交给cgi程序(php的fastcgi),cgi程序根据请求提交的参数作应处理(解析php),然后输出标准的html语句返回给web服服务器,再返回给客户端,这就是普通cgi的工作原理。

cgi的好处就是完全独立于任何服务器,仅仅是做为中间分子。提供接口给apache和php。他们通过cgi搭线来完成搞基动作。这样做的好处了尽量减少2个的关联,使他们2变得更独立。

但是cgi有个蛋疼的地方,就是每一次web请求都会有启动和退出过程,也就是最为人诟病的fork-and-execute模式,这样一在大规模并发下,就死翘翘了。

所以。这个时候fastcgi运用而生了。它事先就早早的启动好了,而且可以启动多个cgi模块,在那里一直运行着等着,等着web发过来的请求,然后再给php解析运算完成生成html给web后,也不会退出,而且继续等着下一个web请求。而且这些cgi的模块启动是可控的,可监测的。这种技术还允许把web server和php运行在不同的主机上,以大规模扩展和改进安全性而不损失生产效率。

所以现在一般操作系统都是fastcgi模式。cig模式也慢慢退出了历史舞台!我们文章中说cgi一般也就指fastcgi。

所以把这种运行方式叫做mod_fastcgi模式

我会在接下来的段落讲如何使用fastcgi模式来连接php和apache(或者nginx)

总结一下:php 与 apache 或者 ngix 结合, 会用sapi 提供2种连接方法:mod_php和mod_fastcgimod_php 模式会将php模块安装到apache下面来运行,2者结合度较大。mod_fastcgi模式则是作为一个中间过程,apache介绍用户请求后,就发送给fastcgi, 再连接php来完成访问。

图形表示一下这2种模式

mod_php 模式

mod_php 模式是将php模块安装到apache中,所以每一次apache结束的请求呢,都会产生一条进程,这个进程就完整的包括php的各种运算计算等操作。

3.png

从图中我们很清晰的可以看到,apache每接收一个请求,都会产生一个进程来连接php通过sapi来完成请求,可想而知,如果一旦用户过多,并发数过多,服务器就会承受不住了。

而且,把mod_php编进apache时,出问题时很难定位是php的问题还是apache的问题。

mod_fastcgi 模式

mod_fastcgi模式则刚刚相反,fastcgi是一个独立与apache和php的独立个体,它随着apache一起启动,生成多个cig模块,等着apache的请求:

4.png

图中fastcgi早早的启动好了,静静的在哪里等着,已有apache发来的httpd请求就立马接收过来,通过调用sapi给php,完成运算。而且不会退出。这样就能应对大规模的并发请求,因为web server的要做的事情少了,所以就更快的去处理下一个请求,这样并发大大的。

由于apache 与 php 独立了。出问题,很好定位到底是哪里出问题了。这点也是这种模式受欢迎的原因之一。

php-fpm

我了个大操,终于要说到php-fpm了。^....^

先开门见山说php-fpm是干嘛好的了。它就是专门来辅助mode_fastcgi模式的。

嗯。很好,先知道它是干嘛的后,我们再回到mode_fastcgi模式。通过前面的瞎鸡巴一大堆的说明,我已经搞清楚了这种模式是怎么样子的一种状态了。

fastcgi 是一个与平台无关,与语言无关,任何语言只要按照它的接口来实现,就能实现自己语言的fastcgi能力和web server 通讯。

PHP-CGI就是PHP实现的自带的FastCGI管理器。

虽然是php官方出品,自带的,但是这丫的却一点也不给力,性能太差,而且也很麻烦不人性化,主要体现在:

  1. php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启。
  2. 直接杀死php-cgi进程,php就不能运行了。

上面2个问题,一直让很多人病垢了很久,所以很多人一直还是在用mode_php方式。

直到 2004年(确定是这么早吗?)一个叫 Andrei Nigmatulin的屌丝发明了PHP-FPM ,这神器的出现就彻底打破了这种局面,这是一个PHP专用的fastcgi管理器,它很爽的克服了上面2个问题,而且,还表现在其他方面更表现强劲. 请戳官网

我擦,这一篇貌似又瞎比比的说超时了啊。好吧。那windows和linux下安装配置php-fpm就下一节来说吧。反正我已经已经把php-fpm和fastcgi给讲清楚了。

===============================================================================

2、php-fpm的安装和启动

在前面我学习过了php中的mod_php模式mode_fastcgi和php-fpm模式:地址,中大致的讲述了几种模式的区别,也明白了php-fpm是fastcgi模式的管理器。今天就来看下php如何安装php-fpm,以及运行。

安装 php-fpm

我的机器是centos 6.2 之前就已经安装过了php 5.4.11,PHP在 5.3.3 之后已经讲php-fpm写入php源码核心了。所以已经不需要另外下载了。我这里是5.4.11所以就可以直接用。

由于我php已经安装好了,而且之前编译的时候没有带上fpm模式,所以我必须找到源码重新编译一下:

要想使php支持php-fpm,只需要在编译的时候带上 --enable-fpm 就可以了。

所以,我需要找到之前的编译参数, 后面加上--enable-fpm ,重新编译下就可以了。之前就讲过,有2种方式可以找到之前的编译参数:

  1. 在源码 /lamp/php-5.4.11/中找到 config.nice,这个就是之前的编译参数
  2. 在php.ini配置文件中找到Configure相关的配置 :
    /usr/local/php/bin/php -i |grep &#39;Configure&#39;

好,我们开始,找到之前的编译参数:

[root@localhost /]# cd /lamp/php-5.4.11 & vi config.nice
&#39;./configure&#39; \
&#39;--prefix=/usr/local/php&#39; \
&#39;--with-config-file-path=/usr/local/php/etc/&#39; \
&#39;--with-apxs2=/usr/local/apache/bin/apxs&#39; \
&#39;--with-mysql=/usr/local/mysql/&#39; \
&#39;--with-libxml-dir=/usr/local/libxml2/&#39; \
&#39;--with-png-dir=/usr/local/libpng/&#39; \
&#39;--with-jpeg-dir=/usr/local/jpeg8/&#39; \
&#39;--with-freetype-dir=/usr/local/freetype/&#39; \
&#39;--with-gd=/usr/local/gd/&#39; \
&#39;--with-zlib-dir=/usr/local/zlib/&#39; \
&#39;--with-mcrypt=/usr/local/libmcrypt/&#39; \
&#39;--with-mysqli=/usr/local/mysql/bin/mysql_config&#39; \
&#39;--enable-soap&#39; \
&#39;--enable-mbstring=all&#39; \
&#39;--enable-sockets&#39; \
登录后复制

加上--enable-fpm后,重新编译:

[root@localhost /]# cd /lamp/php-5.4.11
[root@localhost php-5.4.11]# &#39;./configure&#39; \
    &#39;--prefix=/usr/local/php&#39; \
    &#39;--with-config-file-path=/usr/local/php/etc/&#39; \
    &#39;--with-apxs2=/usr/local/apache/bin/apxs&#39; \
    &#39;--with-mysql=/usr/local/mysql/&#39; \
    &#39;--with-libxml-dir=/usr/local/libxml2/&#39; \
    &#39;--with-png-dir=/usr/local/libpng/&#39; \
    &#39;--with-jpeg-dir=/usr/local/jpeg8/&#39; \
    &#39;--with-freetype-dir=/usr/local/freetype/&#39; \
    &#39;--with-gd=/usr/local/gd/&#39; \
    &#39;--with-zlib-dir=/usr/local/zlib/&#39; \
    &#39;--with-mcrypt=/usr/local/libmcrypt/&#39; \
    &#39;--with-mysqli=/usr/local/mysql/bin/mysql_config&#39; \
    &#39;--enable-soap&#39; \
    &#39;--enable-mbstring=all&#39; \
    &#39;--enable-sockets&#39; \
    &#39;--enable-fpm&#39;
[root@localhost php-5.4.11] make && make install
登录后复制

启动 php-fpm

安装完成之后,我们尝试着启动:

启动命令是:

/usr/local/php/sbin/php-fpm

报错了:

[26-Feb-2015 15:39:55] ERROR: failed to open configuration file &#39;/usr/local/php/etc/php-fpm.conf&#39;: No such file or directory (2)
[26-Feb-2015 15:39:55] ERROR: failed to load configuration file &#39;/usr/local/php/etc/php-fpm.conf&#39;
[26-Feb-2015 15:39:55] ERROR: FPM initialization failed
登录后复制

错误信息说找不到 php-fpm.conf

哦,原来是php-fpm.conf还没有,我们到 /usr/local/php/etc目录下将php-fpm.conf.default拷贝也一份成php-fpm.conf

 cd /usr/local/php/etc/cp php-fpm.conf.default php-fpm.conf
登录后复制

编辑一下这个配置文件:

vim php-fpm.conf

pid = run/php-fpm.pid
user = www
group = www
登录后复制

再次尝试启动:

/usr/local/php/sbin/php-fpm

再次报错说www 用户不存在:

[26-Feb-2015 15:57:38] ERROR: [pool www] cannot get uid for user &#39;www&#39;
[26-Feb-2015 15:57:38] ERROR: FPM initialization failed
登录后复制

好,那我们新建www 用户组:

 groupadd wwwuseradd -g www www
登录后复制

再次启动:

/usr/local/php/sbin/php-fpm

没有任何的输出,表示成功了!!!

php-fpm占用的是9000端口,我们查看下进程:

[root@localhost php-5.4.11]# ps -ef|grep php-fpm
root      1377  1231  0 11:19 pts/1    00:00:00 grep php-fpm
root     29249     1  0 06:22 ?        00:00:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
www      29250 29249  0 06:22 ?        00:00:00 php-fpm: pool www
www      29251 29249  0 06:22 ?        00:00:00 php-fpm: pool www
root     32132  6158  0 08:25 pts/2    00:00:00 vi php-fpm.conf
登录后复制
[root@localhost php-5.4.11]# netstat -tnl | grep 9000
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      
[root@localhost php-5.4.11]#
登录后复制

好,安装和启动都OK了。

开机启动 php-fpm

之前接说过php-fpm是独立于web服务器和php之前的一层服务器,所以,我们需要开机启动它

开机启动的配置文件是:/etc/rc.local ,加入 /usr/local/php/sbin/php-fpm 即可

[root@localhost init]# vi /etc/rc.local

      1 #!/bin/sh
      2 #
      3 # This script will be executed *after* all the other init scripts.
      4 # You can put your own initialization stuff in here if you don&#39;t
      5 # want to do the full Sys V style init stuff.
      6 
      7 touch /var/lock/subsys/local
      8 /usr/local/apache/bin/apachectl start
      9 /usr/local/bin/redis-server /etc/redis.conf
     10 /usr/local/php/sbin/php-fpm
登录后复制

光安装好php-fpm也是没用的,得配合web服务器使用,下一节,我要学习nginx的安装,以及nginx连接php-fpm来使用php。

重启 php-fpm

我们在新安装扩展后,是需要重新php-fpm的,已使扩展生效。

最简单粗暴的重新php-fpm的方式是:

先找到php-fpm的进程号,kill 掉,再用/usr/local/php/sbin/php-fpm 这样启动。

其实还有更多温和的方法,就是使用信号

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`
登录后复制

===============================================================================

3、php-fpm的配置和优化

我在前面几篇中,很详细的讲述了php-fpm的各种介绍,和安装。今天来看一下它的配置文件php-fpm的各种配置以及一些常见的优化。

php-fpm的安装目录

下面是我的平时的环境搭建php的各种安装目录,大家的基本也差不多。

centos等linux平台

/usr/local/php/php
/usr/local/php/etc/php.ini
/usr/local/php/sbin/php-fpm
/usr/local/php/etc/php-fpm.conf
登录后复制

mac平台

/usr/bin/php
/etc/php.ini
/usr/bin/php-fpm
/etc/php-fpm.conf
登录后复制

由于我开发以Mac为主,所以就用Mac的环境配置来学习。

php-fpm配置详解

这是搜索的一份还算算比较详细的php-fpm.conf配置详解,我会针对性的修改下,当然php手册上也有详细的讲解:http://php.net/manual/zh/install.fpm.configuration.php

pid = /usr/local/var/run/php-fpm.pid
#pid设置,一定要开启,上面是Mac平台的。默认在php安装目录中的var/run/php-fpm.pid。比如centos的在: /usr/local/php/var/run/php-fpm.pid

error_log  = /usr/local/var/log/php-fpm.log
#错误日志,上面是Mac平台的,默认在php安装目录中的var/log/php-fpm.log,比如centos的在: /usr/local/php/var/log/php-fpm.log

log_level = notice
#错误级别. 上面的php-fpm.log纪录的登记。可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice.

emergency_restart_threshold = 60
emergency_restart_interval = 60s
#表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启。这两个选项一般保持默认值。0 表示 &#39;关闭该功能&#39;. 默认值: 0 (关闭).

process_control_timeout = 0
#设置子进程接受主进程复用信号的超时时间. 可用单位: s(秒), m(分), h(小时), 或者 d(天) 默认单位: s(秒). 默认值: 0.

daemonize = yes
#后台执行fpm,默认值为yes,如果为了调试可以改为no。在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。

listen = 127.0.0.1:9000
#fpm监听端口,即nginx中php处理的地址,一般默认值即可。可用格式为: &#39;ip:port&#39;, &#39;port&#39;, &#39;/path/to/unix/socket&#39;. 每个进程池都需要设置。如果nginx和php在不同的机器上,分布式处理,就设置ip这里就可以了。

listen.backlog = -1
#backlog数,设置 listen 的半连接队列长度,-1表示无限制,由操作系统决定,此行注释掉就行。backlog含义参考:http://www.3gyou.cc/?p=41

listen.allowed_clients = 127.0.0.1
#允许访问FastCGI进程的IP白名单,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接。

listen.owner = www
listen.group = www
listen.mode = 0666
#unix socket设置选项,如果使用tcp方式访问,这里注释即可。

user = www
group = www
#启动进程的用户和用户组,FPM 进程运行的Unix用户, 必须要设置。用户组,如果没有设置,则默认用户的组被使用。

pm = dynamic 
#php-fpm进程启动模式,pm可以设置为static和dynamic和ondemand
#如果选择static,则进程数就数固定的,由pm.max_children指定固定的子进程数。

#如果选择dynamic,则进程数是动态变化的,由以下参数决定:
pm.max_children = 50 #子进程最大数
pm.start_servers = 2 #启动时的进程数,默认值为: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.min_spare_servers = 1 #保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers = 3 #,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理

pm.max_requests = 500
#设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 &#39;0&#39; 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.

pm.status_path = /status
#FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none. munin监控会使用到

ping.path = /ping
#FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/)。

ping.response = pong
#用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong.

access.log = log/$pool.access.log
#每一个请求的访问日志,默认是关闭的。

access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
#设定访问日志的格式。

slowlog = log/$pool.log.slow
#慢请求的记录日志,配合request_slowlog_timeout使用,默认关闭

request_slowlog_timeout = 10s
#当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 &#39;0&#39; 表示 &#39;Off&#39;

request_terminate_timeout = 0
#设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的&#39;max_execution_time&#39;因为某些特殊原因没有中止运行的脚本有用. 设置为 &#39;0&#39; 表示 &#39;Off&#39;.当经常出现502错误时可以尝试更改此选项。

rlimit_files = 1024
#设置文件打开描述符的rlimit限制. 默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。

rlimit_core = 0
#设置核心rlimit最大限制值. 可用值: &#39;unlimited&#39; 、0或者正整数. 默认值: 系统定义值.

chroot =
#启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用.

chdir =
#设置启动目录,启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录,或者/目录(chroot时)

catch_workers_output = yes
#重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空.
登录后复制

当然还有一些无关紧要的设置,用到了再说吧。

一些重要的设置

php-fpm进程分配

在之前的文章中就说过了。在fasgcgi模式下,php会启动多个php-fpm进程,来接收nginx发来的请求,那是不是进程越多,速度就越快呢?这可不一定!得根据我们的机器配置和业务量来决定。

我们先来看下,设定进程的配置在哪里?

pm = static | dynamic | ondemand
登录后复制

pm可以设置成这样3种,我们用的最多的就上前面2种。

pm = static 模式

pm = static 表示我们创建的php-fpm子进程数量是固定的,那么就只有pm.max_children = 50这个参数生效。你启动php-fpm的时候就会一起全部启动51(1个主+50个子)个进程,颇为壮观。

pm = dynamic 模式

pm = dynamic模式,表示启动进程是动态分配的,随着请求量动态变化的。他由 pm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers 这几个参数共同决定。

上面已经讲过,这里再重申一下吧:

pm.max_children = 50 是最大可创建的子进程的数量。必须设置。这里表示最多只能50个子进程。

pm.start_servers = 20 随着php-fpm一起启动时创建的子进程数目。默认值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2。这里表示,一起启动会有20个子进程。

pm.min_spare_servers = 10
设置服务器空闲时最小php-fpm进程数量。必须设置。如果空闲的时候,会检查如果少于10个,就会启动几个来补上。

pm.max_spare_servers = 30
设置服务器空闲时最大php-fpm进程数量。必须设置。如果空闲时,会检查进程数,多于30个了,就会关闭几个,达到30个的状态。

到底选择static还数dynamic?

很多人恐惧症来袭,不知道选什么好?

一般原则是:动态适合小内存机器,灵活分配进程,省内存。静态适用于大内存机器,动态创建回收进程对服务器资源也是一种消耗。

如果你的内存很大,有8-20G,按照一个php-fpm进程20M算,100个就2G内存了,那就可以开启static模式。如果你的内存很小,比如才256M,那就要小心设置了,因为你的机器里面的其他的进程也算需要占用内存的,所以设置成dynamic是最好的,比如:pm.max_chindren = 8, 占用内存160M左右,而且可以随时变化,对于一半访问量的网站足够了。

慢日志查询

我们有时候会经常饱受500,502问题困扰。当nginx收到如上错误码时,可以确定后端php-fpm解析php出了某种问题,比如,执行错误,执行超时。

这个时候,我们是可以开启慢日志功能的。

slowlog = /usr/local/var/log/php-fpm.log.slow
request_slowlog_timeout = 15s
登录后复制

当一个请求该设置的超时时间15秒后,就会将对应的PHP调用堆栈信息完整写入到慢日志中。

php-fpm慢日志会记录下进程号,脚本名称,具体哪个文件哪行代码的哪个函数执行时间过长:

[21-Nov-2013 14:30:38] [pool www] pid 11877
script_filename = /usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php
[0xb70fb88c] file_get_contents() /usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php:2
登录后复制

通过日志,我们就可以知道第2行的file_get_contents 函数有点问题,这样我们就能追踪问题了。

以上是php-fpm的安装路径是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1243
24
在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? 什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些?PHP的魔法方法包括:1.\_\_construct,用于初始化对象;2.\_\_destruct,用于清理资源;3.\_\_call,处理不存在的方法调用;4.\_\_get,实现动态属性访问;5.\_\_set,实现动态属性设置。这些方法在特定情况下自动调用,提升代码的灵活性和效率。

PHP和Python:比较两种流行的编程语言 PHP和Python:比较两种流行的编程语言 Apr 14, 2025 am 12:13 AM

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP行动:现实世界中的示例和应用程序 PHP行动:现实世界中的示例和应用程序 Apr 14, 2025 am 12:19 AM

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP:网络开发的关键语言 PHP:网络开发的关键语言 Apr 13, 2025 am 12:08 AM

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP的持久相关性:它还活着吗? PHP的持久相关性:它还活着吗? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

说明匹配表达式(PHP 8)及其与开关的不同。 说明匹配表达式(PHP 8)及其与开关的不同。 Apr 06, 2025 am 12:03 AM

在PHP8 中,match表达式是一种新的控制结构,用于根据表达式的值返回不同的结果。1)它类似于switch语句,但返回值而非执行语句块。2)match表达式使用严格比较(===),提升了安全性。3)它避免了switch语句中可能的break遗漏问题,增强了代码的简洁性和可读性。

See all articles