PHP-FPM进程隔离依赖pm配置而非目录权限,需为每个站点配置独立pool、限定pm.max_children、隔离opcache内存、设置rlimit_files与memory_limit,并用systemd cgroup精确控资源。
PHP-FPM 进程隔离靠
配置,不是靠用户目录权限
共享硬件上跑多个 PHP 站点,光靠
或
挡不住资源争用。真正起作用的是 PHP-FPM 的进程管理模型。默认的
会让所有站点共用同一组子进程池,CPU 和内存实际是混用的。
实操建议:
每个站点必须分配独立的
子配置(如
),不能共用一个
段
强制设置
或
,避免
下的进程复用导致内存残留和 CPU 抢占
为每个 pool 显式限定
,值要基于单站真实并发量估算,别直接抄模板里的 50
加上
(Linux)可降低非关键站点的调度权重,但仅对 CPU 有效,不控制内存
必须 per-pool 隔离,否则缓存互相污染
PHP 的 OPcache 是进程级的,同一个 FPM 进程里加载的多个站点脚本会共用一块共享内存。如果 A 站点更新了
,B 站点的缓存可能被踢出或读到旧字节码——这不是 bug,是设计如此。
解决办法只有两个:
立即学习
“
PHP免费学习笔记(深入)
”;
在每个 pool 的配置里加
(单位 MB),且各 pool 值不能相同,否则 PHP 会复用同一块共享内存段
或者彻底禁用 OPcache:
,代价是每个请求都重编译,适合低流量调试环境
注意
设为 0 无效,它只在
时才生效,而后者在生产环境必须关
文件句柄与内存泄漏:
和
不是摆设
一个 PHP 进程打开太多文件(比如日志轮转 + Composer autoload + cURL 句柄未 close),会耗尽系统
,接着整个 pool 卡死,其他站点跟着 502。这不是超时,是内核级拒绝分配。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
关键配置项:
在 pool 配置中设
(别超过
的 10%)
必须写,且要比
小于物理内存的 70%,否则 OOM killer 会随机杀进程
用
检查配置语法后,一定要
,
会导致所有 pool 短暂中断
别信
,它只报当前脚本堆内存,不包含 OPcache、cURL handle、PDO 连接池等真实开销
Docker 不是银弹:宿主机上
的
控制比容器更直接
在没容器的 VPS 上硬套 Docker,反而增加一层调度延迟和内存冗余。真要资源划界,直接用 systemd 的 scope + cgroup 更轻量。
例如限制某个 pool 的 CPU 和内存:
然后在对应 pool 的
里加:
让 FPM 主进程主动上报状态给 systemd
,配合
定位卡顿源头
别依赖
看内存,它统计不准;用
才是真实值
进程数、内存上限、OPcache 分段、cgroup 限频——这四件事没配对,再多的
或
切换都只是心理安慰。
pmchownopen_basedirpm = dynamicwww.conf/etc/php/8.2/fpm/pool.d/site-a.conf[www]pm = staticpm = ondemanddynamicpm.max_childrenprocess.priority = 19opcache.memory_consumptionindex.phpphp_admin_value[opcache.memory_consumption] = 64php_admin_flag[opcache.enable] = Offopcache.revalidate_freqopcache.validate_timestamps = Onrlimit_filesphp_admin_value[memory_limit]ulimit -nrlimit_files = 8192/proc/sys/fs/file-maxphp_admin_value[memory_limit] = 128Mpm.max_children × memory_limitphp-fpm -tsystemctl reload php8.2-fpmrestartmemory_get_usage(true)php-fpmcgroup
sudo systemctl set-property php8.2-fpm.service \
CPUQuota=30% MemoryMax=512M
www.confsystemd_interval = 10sslowlog = /var/log/php8.2-fpm-slow-site-a.logrequest_slowlog_timeout = 5sdocker statssystemctl show --property=MemoryCurrent php8.2-fpm.serviceopen_basediruser