必须通过php_admin_value[memory_limit]在FPM pool配置中设置单worker内存上限,如容器-m 256M则设为128M,并配合Docker -m硬限制与禁用opcache.jit等预占内存项。

怎么在 Docker 里限制 PHP-FPM 单 worker 进程的内存
单个 PHP-FPM worker 进程的内存上限,**不能靠 cgroups 直接卡死**,必须由 PHP 自身控制;否则进程可能在 OOM Killer 触发前就因 memory_limit 不足崩溃,或绕过限制耗尽容器内存。
关键操作是两层绑定:
-
php_admin_value[memory_limit]必须设在 FPM pool 配置中(如www.conf),值建议为容器总内存的 30%~50%,例如容器-m 256M,则设php_admin_value[memory_limit] = 128M - Docker 层用
-m 256M或mem_limit: "256M"设硬上限,留余量给 master 进程、系统缓存和临时文件 - 禁用
opcache.enable_cli=1和opcache.jit_buffer_size过大(如 >128M),这两项会在 CLI/FPM 启动时预占大量内存,且不计入memory_limit统计
验证方式:docker exec -it your-php-container php -r "echo ini_get('memory_limit');" 看是否生效;再用 ps aux --sort=-%mem | head -5 观察实际 RSS 是否稳定在预期范围内。
PHP-FPM worker 进程的 CPU 使用率怎么压住
PHP 本身没有“单进程 CPU 百分比”开关,CPU 占用高本质是代码执行密集或阻塞等待。FPM 层能做的只有间接压制:
立即学习“PHP免费学习笔记(深入)”;
- 在
www.conf中设pm.process_idle_timeout = 10s(默认 0,即永不解散空闲进程),避免 idle worker 持续占 CPU 调度资源 - 用
pm.max_requests = 500强制 worker 定期重启,防止长期运行积累 JIT 编译/OPcache 碎片导致 CPU 持续偏高 - Docker 层加
--cpus="0.5"或cpus: "0.5"(cgroup v2 下等效cpu.max),这是真正限制单个容器能用的 CPU 时间片——注意:它限制的是整个容器,不是单个 worker,但 worker 数量受pm.max_children控制,所以效果可预期 - 禁用
opcache.jit=1255改为1205或干脆关 JIT(opcache.jit=0),JIT 编译本身吃 CPU,低配容器里得权衡
为什么 php_value[memory_limit] 在容器里不推荐用
因为 php_value 可被脚本里的 ini_set() 覆盖,而容器环境通常不允许修改运行时配置——一旦某段代码调用 ini_set('memory_limit', '-1'),整个 worker 就脱离管控。
必须用 php_admin_value[memory_limit],它在 FPM master 进程加载时锁定,无法被用户代码绕过。配置位置只能在 pool 段(如 [www] 下),不能写在全局 php-fpm.conf 的 [global] 段里——那里不生效。
常见错误:把 php_admin_value 写进 php.ini,那根本不会被 FPM 解析;或者写在 Nginx 的 fastcgi_param 里,那是传给 CGI 的环境变量,PHP 不认。
容器里改完配置不生效?先查这三处
容器内 PHP-FPM 配置加载顺序极易混乱,尤其用了自定义镜像或宝塔类面板打包版:
- 确认 FPM 实际加载的 pool 配置路径:
php-fpm -t输出里 “loaded configuration file” 后面的www.conf是哪个文件,别改错副本 - 检查是否多个
php_admin_value[memory_limit]冲突:用php-fpm -tt(测试模式)看最终合并后的配置,搜索memory_limit出现几次 - 容器启动时是否挂载了覆盖配置的 volume,比如把宿主机的
/etc/php/8.4/fpm/pool.d/www.conf映射进去,结果改了镜像里的却没生效
最稳的做法:在 Dockerfile 里用 RUN sed -i 's/^;*php_admin_value\[memory_limit\].*/php_admin_value\[memory_limit\] = 128M/' /www/server/php/84/etc/php-fpm.d/www.conf(路径按实际调整),构建即固化,不依赖运行时挂载。



















