PHP脚本运行过程中如果占用内存超过预设限制,就会触发内存溢出错误,导致程序终止。合理设置内存限制并结合memory_get_usage函数监控内存变化,是避免这类问题的核心手段。

PHP内存限制的基础配置
PHP有两个常用的内存限制配置项,分别是memory_limit和max_execution_time,其中memory_limit直接决定了单个脚本可以使用的最大内存。
php.ini全局配置
可以在php.ini文件中直接设置memory_limit的值,常见设置方式如下:
; 限制单个脚本最大使用128M内存 memory_limit = 128M ; 设置为-1表示不限制内存,仅开发环境临时使用 ; memory_limit = -1
脚本内动态配置
如果只需要对单个脚本调整内存限制,可以在代码中使用ini_set函数动态修改,无需修改全局配置:
<?php
// 动态将当前脚本内存限制设置为256M
ini_set('memory_limit', '256M');
// 也可以设置为不限制,仅临时调试使用
// ini_set('memory_limit', '-1');
?>
memory_get_usage函数的使用方法
memory_get_usage是PHP内置的内存监控函数,用于获取当前脚本已经使用的内存大小,单位是字节。
函数参数说明
该函数有一个可选参数$real_usage,默认值为false,两个取值的区别如下:
| 参数值 | 含义 |
|---|---|
| false(默认) | 返回当前脚本实际使用的内存,不包含PHP底层分配但未使用的内存 |
| true | 返回PHP向系统申请的总内存,包含已分配但未使用的部分 |
基础使用示例
下面是memory_get_usage的基础使用代码,展示不同阶段的脚本内存占用:
<?php
// 初始内存占用
$startMemory = memory_get_usage();
echo "初始内存占用:" . round($startMemory / 1024, 2) . "KB" . PHP_EOL;
// 执行一段占内存的操作
$arr = [];
for ($i = 0; $i < 10000; $i++) {
$arr[] = str_repeat('test', 100);
}
// 操作后的内存占用
$endMemory = memory_get_usage();
echo "操作后内存占用:" . round($endMemory / 1024, 2) . "KB" . PHP_EOL;
echo "本次操作新增内存:" . round(($endMemory - $startMemory) / 1024, 2) . "KB" . PHP_EOL;
?>
结合memory_get_usage实现内存溢出预警
可以在脚本执行过程中定期调用memory_get_usage检查内存使用量,当接近内存限制时主动处理,避免触发溢出错误。
获取当前内存限制
首先需要通过ini_get函数获取当前生效的内存限制值,再转换为字节单位:
<?php
function getMemoryLimitBytes() {
$limit = ini_get('memory_limit');
// 处理无限制的情况
if ($limit == -1) {
return -1;
}
$unit = strtolower(substr($limit, -1));
$value = (int)substr($limit, 0, -1);
switch ($unit) {
case 'g':
$value *= 1024;
case 'm':
$value *= 1024;
case 'k':
$value *= 1024;
}
return $value;
}
?>
内存预警实现示例
下面的代码实现了内存使用率超过80%时输出预警信息,超过95%时主动终止脚本的功能:
<?php
// 引入上面的获取内存限制函数
require_once 'get_memory_limit.php';
$limitBytes = getMemoryLimitBytes();
// 如果不限制内存则跳过预警逻辑
if ($limitBytes != -1) {
$usedBytes = memory_get_usage();
$usageRate = $usedBytes / $limitBytes;
if ($usageRate > 0.8) {
echo "内存使用率超过80%,当前使用:" . round($usedBytes / 1024 / 1024, 2) . "MB" . PHP_EOL;
}
if ($usageRate > 0.95) {
echo "内存使用率超过95%,即将终止脚本" . PHP_EOL;
exit;
}
}
?>
常见内存溢出规避建议
除了设置内存限制和监控内存,还可以从代码层面减少内存占用:
- 处理大文件时避免使用
file_get_contents一次性读取全部内容,改用fopen配合fgets逐行读取 - 及时销毁不再使用的大数组、大对象,使用
unset函数释放内存 - 避免在循环中累加过大的临时变量,尽量拆分处理逻辑
- 数据库查询时避免一次性获取全部结果集,使用游标方式逐条处理
注意:unset只是断开变量和内存的引用,PHP的垃圾回收机制不会立即释放内存,只是将内存标记为可复用,因此监控到的内存值可能不会立即下降。总结
通过合理配置memory_limit可以从根源上限制脚本最大内存占用,结合memory_get_usage函数可以实时监控内存变化,提前发现内存异常。实际开发中建议将内存监控逻辑封装成通用工具函数,在耗时久、内存占用高的脚本中定期调用,同时配合代码层面的优化,就能有效减少PHP脚本内存溢出的问题。
PHPmemory_get_usage脚本内存限制内存溢出监控修改时间:2026-07-01 03:54:37