直接调用 ini_get('memory_limit') 可获取当前内存限制字符串(如"128M"或"-1"),需解析为字节数用于比较;memory_get_usage(true) 返回已用内存,与内存限制属不同维度,不可混淆。

用 ini_get('memory_limit') 获取当前内存限制值
PHP 脚本运行时能使用的最大内存量由 memory_limit 配置项控制,这个值在运行期可读不可写(除非用 ini_set 且未被禁用)。最直接的检测方式就是调用 ini_get('memory_limit'):
echo ini_get('memory_limit'); // 输出类似 "128M"、"256M" 或 "-1"
注意返回值是字符串,可能带单位(K、M、G),也可能为 -1 表示无限制。别直接拿它和数字比较,要先解析。
把 memory_limit 字符串转成字节数方便判断
做容量对比或预警时,需要统一单位。PHP 没有内置函数自动转,得自己处理:
-
-1直接表示不限制,可视为无穷大 - 末尾是
K就乘 1024,M乘 1024²,G乘 1024³ - 不带单位默认是字节,但实际配置中极少这么写
function memory_limit_in_bytes() {
$limit = ini_get('memory_limit');
if ($limit === '-1') return -1;
$limit = trim($limit);
$unit = strtolower(substr($limit, -1));
$value = (int)$limit;
switch ($unit) {
case 'g': $value *= 1024;
case 'm': $value *= 1024;
case 'k': $value *= 1024;
}
return $value;
}
echo memory_limit_in_bytes(); // 输出如 134217728(对应 128M)
为什么 memory_get_usage(true) 不等于内存限制检测?
新手常混淆这两个概念:memory_get_usage(true) 返回的是当前脚本已申请的内存块大小(含未释放的分配),而 memory_limit 是 Zend 引擎拒绝继续分配的阈值。它们属于不同维度:
立即学习“PHP免费学习笔记(深入)”;
- 前者是“已经用了多少”,后者是“最多还能用多少”
- 即使
memory_get_usage(true)远小于memory_limit,仍可能因碎片或分配失败触发Fatal error: Allowed memory size exhausted - 某些 SAPI(如 PHP-FPM)还受外部进程限制(如
pm.max_requests或容器 cgroup),ini_get看不到这些
CLI 和 Web SAPI 的 memory_limit 可能完全不同
PHP 在不同运行模式下加载的配置文件不同,导致 memory_limit 值不一致:
- Web 环境(Apache/Nginx + PHP-FPM)通常读
php.ini或www.conf中的php_admin_value[memory_limit] - CLI 模式默认可能用另一份
php.ini,或继承系统级设置,常见值是-1(无限制) - 用
php --ini查 CLI 加载路径,用phpinfo()查 Web 环境实际生效配置
跨环境部署时,别假设值一样。上线前务必在目标环境里执行 echo ini_get('memory_limit'); 实测。











