PHP配置优化:php

Stella981
• 阅读 943

PHP-FPM是一个PHP FastCGI管理器,php-fpm.conf配置文件用于控制PHP-FPM管理进程的相关参数,比如工作子进程的数量、运行权限、监听端口、慢请求等等。 我们在编译安装PHP的时,在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。PHP-FPM配置文件为 php-fpm.conf,其语法类似 php.ini 。一般我们可以在安装目录中找到:_**/usr/local/php/etc/php-fpm.conf**,如果没有的话,那就可能在***/usr/local/php/etc/php-fpm.d/.conf_**。

全局配置

[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice

pid:设置PID文件的位置。

error_log:错误日志的位置

log_level:错误级别。可用级别为:alert(必须立即处理),error(错误情况),warning(警告情况),notice(一般重要信息),debug(调试信息)。默认:notice。

进程池配置

在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置,在默认的php-fpm进程池的配置文件中,开头是[www]。

[www]
listen = /tmp/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 51
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 40
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log

listen:设置接受 FastCGI 请求的地址。可用格式为:'ip:port','port','/path/to/unix/socket'。我们这里配置/tmp/php-cgi.sock,使用Unix域Socket因为不走网络,可以提高Nginx和php-fpm通信的性能,但在高并发的情况下可能不稳定,这时我们需要设置下一个参数backlog。当然你也可以设置为127.0.0.1:9000,但我不建议使用。据nginx.conf中的配置fastcgi_pass unix:/tmp/php-cgi.sock;设置PHP监听,:让Nginx支持PHP。

listen.backlog:设置 listen 的半连接队列长度,-1表示无限制,由操作系统决定。

listen.allowed_clients:允许访问FastCGI进程的IP白名单,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接。我把它设置为127.0.0.1,即只有当前设备能把请求转发给php-fpm进程池。

listen.owner:运行所使用的用户和组,我们这里设置为www用户组,权限为 0666。

listen.group:同上,设置为www。

listen.mode:同上,设置为0666。

user:FPM 进程运行的系统用户。必须设置,这里我们设置为www,即非root用户。

group:FPM 进程运行的系统用户组。如果没有设置,则默认用户的组被使用。

pm:设置进程管理器如何管理子进程。可用值:static,ondemand,dynamic。dynamic表示php-fpm进程数是动态的,最开始是pm.start_servers指定的数量,如果请求较多,则会自动增加,保证空闲的进程数不小于pm.min_spare_servers,如果进程数较多,也会进行相应清理,保证多余的进程数不多于pm.max_spare_servers。static表示php-fpm进程数是静态的, 进程数自始至终都是pm.max_children指定的数量,不再增加或减少。

pm.max_children:静态方式下开启的php-fpm进程数量,这个设置没有绝对正确的值。一般应用的PHP进程需要消耗10~30MB内存,假设我们使用的服务器设备为这个PHP-FPM进程池分配1024M内存,那么我们可以将这个值设置为(1024MB内存)/(每个进程使用20M)= 51个进程。

pm.start_servers:动态方式下的起始php-fpm进程数量,即当PHP-FPM启动时,PHP-FPM进程池中立即可用的进程数,我一般设置这个值为10。

pm.min_spare_servers:动态方式下的最小php-fpm进程数量,如果PHP空闲时,PHP-FPM进程池中科院存在进程数量的最小值。这个值一般与pm.start_servers设置的值一样,所以我这里也设置为10。

pm.max_spare_servers:动态方式下的最大php-fpm进程数量,如果空闲进程大于此值,则进行清理。这个值设置的要比pm.start_servers大。

对于内存大的服务器(比如8G以上)来说,建议指定静态的max_children值,因为这样不需要进行额外的进程数目控制,会提高效率。因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。数量也可以根据 内存/30M 得到,比如8GB内存可以设置为100,那么php-fpm耗费的内存就能控制在 2G-3G的样子。如果内存稍微小点,比如1G,那么指定静态的进程数量更加有利于服务器的稳定。这样可以保证php-fpm只获取够用的内存,将不多的内存分配给其他应用去使用,会使系统的运行更加畅通。

request_terminate_timeout:最大执行时间, 在php.ini中也可以进行配置(max_execution_time),这个是用来处理因为PHP执行时间超长而报502错误的解决。

request_slowlog_timeout:当一个请求超过该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中。 设置为 '0' 表示 'Off',正常生产环境中我们把它设置为0。

slowlog:慢请求的记录日志。

我们有时候会经常饱受500,502问题困扰。当nginx收到如上错误码时,可以确定后端php-fpm解析php出了某种问题,比如,执行错误,执行超时。这个时候,我们是可以开启慢日志功能的。比如设置request_slowlog_timeout:10s,当一个请求时长超过该设置的超时时间10秒后,就会将对应的PHP调用堆栈信息完整写入到慢日志中。 php-fpm慢日志会记录下进程号,脚本名称,具体哪个文件哪行代码的哪个函数执行时间过长等信息。

设置好后,执行以下命令重启PHP-FPM主进程使配置生效。

/etc/init.d/php-fpm restart

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
PHP 技能精进之 PHP
PHPFPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。那么当我们谈论PHPFPM多进程模型的时候,作为PHPer的你了解多少呢?首先,让我们一起看几个问题:①:PHPFPM启动进程的方式主要有哪几种,区别是什么?②:PHPFPM,是主进程接收请求转给子进程,还是子进程单独接收请求并处理
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这