最直接的方式是修改 php.ini 中的 memory_limit,如设为 memory_limit = 512m,改后需重启 web 服务器或 php-fpm;cli 与 web 模式可能使用不同配置文件,.htaccess 仅适用于 apache mod_php,ini_set() 受 disable_functions 和 sapi 类型限制。

php.ini 里改 memory_limit 是最直接的方式
PHP 脚本跑崩报 Fatal error: Allowed memory size of XXX bytes exhausted,说明当前限制太低,得调高。最稳妥的做法是改全局配置文件 php.ini,它对所有脚本生效,且不会被运行时函数覆盖。
找到你正在用的 php.ini 文件(执行 php --ini 或 phpinfo() 查路径),搜索 memory_limit,改成你需要的值,比如:
memory_limit = 512M
注意单位必须带后缀:M(兆字节)、G(吉字节),不能写成 512 或 512mb —— 后者会被当成 0,反而更糟。
- 改完必须重启 Web 服务器(如 Apache)或 PHP-FPM 进程,仅 reload 不生效
- CLI 模式和 Web 模式可能用不同
php.ini,确认你改的是实际加载的那个 - 设太高(比如
2G)不解决根本问题,只是掩盖内存泄漏或低效算法
运行时用 ini_set() 临时调整只对当前脚本有效
某些场景下不能动 php.ini(如共享主机、CI 环境),可以用 ini_set('memory_limit', '256M') 在脚本开头动态设置。但它受两个关键限制:一是必须在脚本早期调用(最好第一行),二是如果 php.ini 里设了 memory_limit = -1(无限制),这个函数才允许修改;否则可能被 disable_functions 拦住。
立即学习“PHP免费学习笔记(深入)”;
-
ini_set()只影响当前请求生命周期,不影响其他脚本或后续请求 - 若脚本已接近耗尽内存再调用,
ini_set()自身可能触发 OOM 而失败 - CLI 下可用,但部分托管环境禁用该函数,检查
disable_functions配置项
通过 .htaccess 或 php_value 修改(仅限 Apache + mod_php)
如果你用 Apache 且没启用 PHP-FPM,可以在项目根目录 .htaccess 里加一行:
php_value memory_limit 384M
这相当于为该目录下所有 PHP 脚本设置独立限制。但注意:这个指令在 php-fpm 或 Nginx 环境下完全无效;而且如果 PHP 是以 CGI 模式运行,也会被忽略。
- Apache 必须开启
AllowOverride Options才允许.htaccess生效 - 值不能带空格,也不能用小写单位(
m不行,必须M) - 如果同时在
php.ini和.htaccess设置,后者优先级更高(仅限 mod_php)
为什么 ini_set() 有时改不生效?常见原因
不是所有环境都允许运行时修改内存限制。最常踩的坑是:PHP 启动时已锁定内存上限,或者宿主明确禁止该行为。
-
memory_limit在某些 SAPI(如嵌入式或部分容器镜像)中属于“PHP_INI_SYSTEM”,只能在php.ini改 - 检查
disable_functions是否包含ini_set—— 出现Warning: ini_set(): A directive matching 'memory_limit' was not found就是这个原因 - Docker 容器里如果用了
php:alpine等精简镜像,可能默认关闭了相关 SAPI 功能 - Cloudflare Workers、Vercel Edge Functions 等无服务器环境根本不支持修改此参数
真正要改内存限制,先确认你的部署模式和权限边界,而不是盲目套命令。很多“改了不生效”的问题,其实卡在没搞清 PHP 是怎么启动的。











