如何让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
相关产品推荐
相关产品推荐

