PHP-FPM进程隔离依赖pm配置而非目录权限,需为每个站点配置独立pool、限定pm.max_children、隔离opcache内存、设置rlimit_files与memory_limit,并用systemd cgroup精确控资源。

PHP-FPM 进程隔离靠 pm 配置,不是靠用户目录权限
共享硬件上跑多个 PHP 站点,光靠 chown 或 open_basedir 挡不住资源争用。真正起作用的是 PHP-FPM 的进程管理模型。默认的 pm = dynamic 会让所有站点共用同一组子进程池,CPU 和内存实际是混用的。
实操建议:
- 每个站点必须分配独立的
www.conf子配置(如/etc/php/8.2/fpm/pool.d/site-a.conf),不能共用一个[www]段 - 强制设置
pm = static或pm = ondemand,避免dynamic下的进程复用导致内存残留和 CPU 抢占 - 为每个 pool 显式限定
pm.max_children,值要基于单站真实并发量估算,别直接抄模板里的 50 - 加上
process.priority = 19(Linux)可降低非关键站点的调度权重,但仅对 CPU 有效,不控制内存
opcache.memory_consumption 必须 per-pool 隔离,否则缓存互相污染
PHP 的 OPcache 是进程级的,同一个 FPM 进程里加载的多个站点脚本会共用一块共享内存。如果 A 站点更新了 index.php,B 站点的缓存可能被踢出或读到旧字节码——这不是 bug,是设计如此。
解决办法只有两个:
- 在每个 pool 的配置里加
php_admin_value[opcache.memory_consumption] = 64(单位 MB),且各 pool 值不能相同,否则 PHP 会复用同一块共享内存段 - 或者彻底禁用 OPcache:
php_admin_flag[opcache.enable] = Off,代价是每个请求都重编译,适合低流量调试环境 - 注意
opcache.revalidate_freq设为 0 无效,它只在opcache.validate_timestamps = On时才生效,而后者在生产环境必须关
文件句柄与内存泄漏:rlimit_files 和 php_admin_value[memory_limit] 不是摆设
一个 PHP 进程打开太多文件(比如日志轮转 + Composer autoload + cURL 句柄未 close),会耗尽系统 ulimit -n,接着整个 pool 卡死,其他站点跟着 502。这不是超时,是内核级拒绝分配。
关键配置项:
- 在 pool 配置中设
rlimit_files = 8192(别超过/proc/sys/fs/file-max的 10%) -
php_admin_value[memory_limit] = 128M必须写,且要比pm.max_children × memory_limit小于物理内存的 70%,否则 OOM killer 会随机杀进程 - 用
php-fpm -t检查配置语法后,一定要systemctl reload php8.2-fpm,restart会导致所有 pool 短暂中断 - 别信
memory_get_usage(true),它只报当前脚本堆内存,不包含 OPcache、cURL handle、PDO 连接池等真实开销
Docker 不是银弹:宿主机上 php-fpm 的 cgroup 控制比容器更直接
在没容器的 VPS 上硬套 Docker,反而增加一层调度延迟和内存冗余。真要资源划界,直接用 systemd 的 scope + cgroup 更轻量。
例如限制某个 pool 的 CPU 和内存:
sudo systemctl set-property php8.2-fpm.service \ CPUQuota=30% MemoryMax=512M
然后在对应 pool 的 www.conf 里加:
-
systemd_interval = 10s让 FPM 主进程主动上报状态给 systemd -
slowlog = /var/log/php8.2-fpm-slow-site-a.log,配合request_slowlog_timeout = 5s定位卡顿源头 - 别依赖
docker stats看内存,它统计不准;用systemctl show --property=MemoryCurrent php8.2-fpm.service才是真实值
进程数、内存上限、OPcache 分段、cgroup 限频——这四件事没配对,再多的 open_basedir 或 user 切换都只是心理安慰。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











