PHP怎么限制脚本内存溢出_memory_get_usage监控方法

来源:站长查询作者:清原小日向头衔:网络博主
导读:本期聚焦于小伙伴创作的《PHP怎么限制脚本内存溢出_memory_get_usage监控方法》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《PHP怎么限制脚本内存溢出_memory_get_usage监控方法》有用,将其分享出去将是对创作者最好的鼓励。

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

PHP怎么限制脚本内存溢出_memory_get_usage监控方法

PHP内存限制的基础配置

PHP有两个常用的内存限制配置项,分别是memory_limitmax_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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。