如何调整phpEnv中PHP-FPM参数以显著提升高并发项目的性能?
- 内容介绍
- 文章标签
- 相关推荐
本文共计806个文字,预计阅读时间需要4分钟。
当然可以,请您提供需要改写的原文,我将根据您的要求进行修改。
怎么确认当前生效的 php-fpm.conf 和 www.conf 路径
phpEnv 安装的 PHP-FPM 配置分散在多个位置,容易搞混:
- 主配置通常在
/usr/local/phpenv/versions/{version}/etc/php-fpm.conf,但实际加载的是它include的子配置 - 关键的进程池配置(
www.conf)一般在/usr/local/phpenv/versions/{version}/etc/php-fpm.d/www.conf,这是你唯一需要动的地方 - 用
php-fpm -t校验前,先运行php-fpm -c /usr/local/phpenv/versions/{version}/etc/php-fpm.conf -y /usr/local/phpenv/versions/{version}/etc/php-fpm.conf -t显式指定路径,避免误用系统默认配置 - 宝塔用户尤其注意:phpEnv 和宝塔共存时,宝塔可能接管了服务启停,
systemctl restart php-fpm重启的可能是宝塔自己的实例,不是 phpEnv 的
dynamic 模式下 pm.start_servers 设太低会卡顿
phpEnv 默认新建版本时,www.conf 里的 pm.start_servers 常为 2 或 5,这对并发稍高的项目就是瓶颈。流量突增时,新请求排队等 fork,ps aux | grep 'php-fpm:' 会看到大量 php-fpm: pool www 进程状态在 S(sleep)和 Z(zombie)间跳。
- 正确做法:按 CPU 核数 × 2 设
pm.start_servers(如 4 核 →8),再设pm.min_spare_servers = 4、pm.max_spare_servers = 16 -
pm.max_children必须 ≥pm.max_spare_servers,否则空闲进程数永远上不去 - 别信“CPU 核数 × 4”这种泛泛建议——phpEnv 环境下 PHP 扩展多(比如 Xdebug、Swoole、Redis),单进程 RSS 常达 60–100MB,4 核机器设
pm.max_children = 64就可能 OOM
slowlog 日志路径常被 phpEnv 忽略或写错
phpEnv 安装后,www.conf 中的 slowlog 默认值常为空或指向不存在目录(如 /var/log/php-fpm-slow.log),导致开了等于没开。
立即学习“PHP免费学习笔记(深入)”;
- 手动改成绝对路径并确保目录可写:
slowlog = /usr/local/phpenv/versions/{version}/var/log/php-slow.log - 配套设
request_slowlog_timeout = 1s(别用 0 或 5s),否则慢请求抓不到或全堆一起 - 必须加
request_terminate_timeout = 1.5s,否则慢请求占着 worker 不放,后续请求全堵住 - 查日志前先
mkdir -p /usr/local/phpenv/versions/{version}/var/log并chown www:www,否则权限拒绝写入
最易被忽略的一点:phpEnv 切换 PHP 版本后,www.conf 不会自动同步更新,旧版残留参数(比如 pm = static)可能还在生效,而你却在 dynamic 模式下调试——务必每次切换后手动检查 www.conf 里的 pm 值和所有相关参数是否重置为你想要的状态。
本文共计806个文字,预计阅读时间需要4分钟。
当然可以,请您提供需要改写的原文,我将根据您的要求进行修改。
怎么确认当前生效的 php-fpm.conf 和 www.conf 路径
phpEnv 安装的 PHP-FPM 配置分散在多个位置,容易搞混:
- 主配置通常在
/usr/local/phpenv/versions/{version}/etc/php-fpm.conf,但实际加载的是它include的子配置 - 关键的进程池配置(
www.conf)一般在/usr/local/phpenv/versions/{version}/etc/php-fpm.d/www.conf,这是你唯一需要动的地方 - 用
php-fpm -t校验前,先运行php-fpm -c /usr/local/phpenv/versions/{version}/etc/php-fpm.conf -y /usr/local/phpenv/versions/{version}/etc/php-fpm.conf -t显式指定路径,避免误用系统默认配置 - 宝塔用户尤其注意:phpEnv 和宝塔共存时,宝塔可能接管了服务启停,
systemctl restart php-fpm重启的可能是宝塔自己的实例,不是 phpEnv 的
dynamic 模式下 pm.start_servers 设太低会卡顿
phpEnv 默认新建版本时,www.conf 里的 pm.start_servers 常为 2 或 5,这对并发稍高的项目就是瓶颈。流量突增时,新请求排队等 fork,ps aux | grep 'php-fpm:' 会看到大量 php-fpm: pool www 进程状态在 S(sleep)和 Z(zombie)间跳。
- 正确做法:按 CPU 核数 × 2 设
pm.start_servers(如 4 核 →8),再设pm.min_spare_servers = 4、pm.max_spare_servers = 16 -
pm.max_children必须 ≥pm.max_spare_servers,否则空闲进程数永远上不去 - 别信“CPU 核数 × 4”这种泛泛建议——phpEnv 环境下 PHP 扩展多(比如 Xdebug、Swoole、Redis),单进程 RSS 常达 60–100MB,4 核机器设
pm.max_children = 64就可能 OOM
slowlog 日志路径常被 phpEnv 忽略或写错
phpEnv 安装后,www.conf 中的 slowlog 默认值常为空或指向不存在目录(如 /var/log/php-fpm-slow.log),导致开了等于没开。
立即学习“PHP免费学习笔记(深入)”;
- 手动改成绝对路径并确保目录可写:
slowlog = /usr/local/phpenv/versions/{version}/var/log/php-slow.log - 配套设
request_slowlog_timeout = 1s(别用 0 或 5s),否则慢请求抓不到或全堆一起 - 必须加
request_terminate_timeout = 1.5s,否则慢请求占着 worker 不放,后续请求全堵住 - 查日志前先
mkdir -p /usr/local/phpenv/versions/{version}/var/log并chown www:www,否则权限拒绝写入
最易被忽略的一点:phpEnv 切换 PHP 版本后,www.conf 不会自动同步更新,旧版残留参数(比如 pm = static)可能还在生效,而你却在 dynamic 模式下调试——务必每次切换后手动检查 www.conf 里的 pm 值和所有相关参数是否重置为你想要的状态。

