You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让PHP快速占用大量内存以测试Out Of Memory错误?

快速触发PHP内存耗尽的实用方法

针对你需要测试的两种内存耗尽场景,下面给出直接可用的实现方式,无需依赖第三方工具:

场景1:触发PHP自身的memory_limit限制

不需要手动调低memory_limit,直接生成足够大的内存占用量即可触发限制。可以通过累加字符串或填充数组实现,示例代码如下:

// 设定目标内存占用(比如256MB,根据你的php.ini中memory_limit调整)
$targetMemory = 1024 * 1024 * 256;
$currentUsage = 0;
$buffer = '';

while ($currentUsage < $targetMemory) {
    // 每次追加1MB的字符块
    $chunk = str_repeat('x', 1024 * 1024);
    $buffer .= $chunk;
    // 获取PHP实际占用的内存(含预留内存)
    $currentUsage = memory_get_usage(true);
    echo "当前内存占用:" . number_format($currentUsage / 1024 / 1024, 2) . "MB\n";
}

运行后,当内存占用接近或达到memory_limit时,PHP会抛出Fatal Error: Allowed memory size of X bytes exhausted错误。

场景2:系统内存耗尽(未触发PHP的memory_limit)

这种场景需要先让PHP解除自身内存限制,再持续占用内存直到系统无法分配。推荐用数组存储独立内存块(避免PHP对单一字符串的内存优化),示例代码:

// 先解除PHP内存限制(也可以在php.ini中设置memory_limit=-1)
ini_set('memory_limit', '-1');

$memoryBlocks = [];
// 每个内存块设为32MB,可根据系统内存大小调整
$blockSize = 1024 * 1024 * 32;

while (true) {
    // 生成随机字符串存入数组,确保每个块是独立内存
    $memoryBlocks[] = str_repeat(str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789'), $blockSize / 36);
    $totalUsage = memory_get_usage(true);
    echo "累计内存占用:" . number_format($totalUsage / 1024 / 1024, 2) . "MB\n";
    // 暂停1秒方便观察系统内存变化
    sleep(1);
}

运行后,脚本会持续占用系统内存,直到物理内存+交换分区被耗尽。此时系统会启动OOM Killer终止进程,或PHP直接返回Out of memory错误。

额外提示

  • 用memory_get_usage(true)获取实际分配的内存,比memory_get_usage()(仅获取脚本使用的内存)更贴近真实占用情况。
  • 测试系统内存耗尽时,务必在隔离的测试环境进行,避免影响正常服务。
  • 如果需要精准控制占用内存大小,可以调整targetMemory或blockSize参数,配合memory_get_usage(true)实时监控。

内容的提问来源于stack exchange,提问作者Colin Pickup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:31:07