PHP无max_memory_limit,仅支持memory_limit软限制;需通过ulimit、systemd MemoryLimit或Docker --memory等系统层机制实现硬限制;CLI与Web环境配置文件不同,修改后必须重启服务。

max_memory_limit 配置项,官方只支持 memory_limit —— 它是软限制,不是硬上限。真要卡死内存用量,得靠系统层机制。
确认你改的是哪个 memory_limit
同一台机器上 CLI 和 Web(FPM/Apache)很可能加载不同的配置文件:
- CLI 模式:运行
php --ini查看 Loaded Configuration File - FPM 模式:运行
php-fpm -i | grep "Loaded Configuration File"或在脚本里调用phpinfo() - 宝塔用户注意:网站单独设置走的是
.user.ini,优先级高于全局php.ini,但只对当前站点生效 - 若 FPM pool 配置里写了
php_admin_value[memory_limit] = 256M,它会无视php.ini里的值
memory_limit 值怎么写才有效
常见无效写法:512、512mb、2G (末尾带空格)、"512M"(加引号)——这些都会被 PHP 解析为 0 或报错。
- 单位必须大写:
M、G、K;小写m或g在某些旧解析器中可能失败 - 推荐显式写法:
512M(比2G更稳妥,避免 G 被误读为变量) -
-1表示不限制,但仅限 CLI 场景;Web 环境下慎用,容易拖垮整个 FPM 进程池 - 修改后必须重启服务:Apache/Nginx 要 reload,PHP-FPM 必须 restart(reload 不重读
memory_limit)
为什么 ini_set('memory_limit', ...) 有时不生效
这个函数不是万能的,受三重约束:
- 必须在脚本最开头调用(比如
index.php第一行),否则可能已接近 OOM 边界,调用自身就触发 fatal error - 如果
php.ini里设了memory_limit = -1,ini_set()才允许覆盖;否则会被拒绝 - 若
disable_functions列表里包含ini_set,该函数直接不可用(查phpinfo()的 disable_functions 项) - 它只影响当前请求生命周期,不影响其他请求,也不改变
phpinfo()显示的“主值”
真正卡死内存:靠系统层硬限
memory_limit 触发时只是抛 Fatal error: Allowed memory size of XXX bytes exhausted,进程未必终止。要强制 OOM-kill,必须用外部机制:
立即学习“PHP免费学习笔记(深入)”;
- CLI 场景:
ulimit -v 524288(限制 512MB 虚拟内存,单位 KB) - FPM 场景:配合 systemd,在
www.conf所在 service 文件里加MemoryLimit=512M,并确保MemoryAccounting=yes - Docker 场景:
--memory=512m,内核通过 cgroup v2 直接干掉超限进程 - 注意:容器里
ulimit常被覆盖,以 cgroup / systemd 设置为准
memory_limit。



















