【问题标题】:How to intentionally cause a "Fatal error: Allowed memory size of xxx bytes exhausted"如何故意导致“致命错误:允许的 xxx 字节内存大小已用尽”
【发布时间】:2010-09-01 23:31:46
【问题描述】:

每当我收到此错误时,我都会增加内存来修复它。我有一个案例,出于测试目的,我想让一个页面用完所有内存,无论我设置 memory_limit 多大。

我不知道该怎么做。

编辑: 我试过这个:

<?php
echo "start";
@ini_set('memory_limit', '1M');
$test = "a";
while (1) {
    $test = "a" + $test;    
}
echo "done";
?>

但它没有崩溃。最后它只打印了“startstart”,奇怪的是它被打印了两次......

我想要一个简单的代码示例,“将很多东西放在内存中”.. 我知道的就这么多。

【问题讨论】:

  • 要有创意,我只能这么说。
  • 下一次,从发布您正在尝试和/或尝试过的内容开始。

标签: php memory overflow


【解决方案1】:

应该吃掉所有的记忆。

$a = 'x';
while (true) {
    $a = $a.$a;
}

【讨论】:

  • 需要
  • 我基本上试过了,虽然效率稍高一些,但并没有提供更好的结果。
  • @phazei:看我的回答。你有 $test = "a" + $test; 这与 $test = "a" . $test; 非常不同
  • $a .= $a 更简洁,更容易输入。 :)
【解决方案2】:

问题来了:

$test = "a" + $test;

+ 在 PHP 中用于算术,而不是字符串连接。使用:

$test = "a" . $test;

【讨论】:

  • 多次用键盘敲自己的脑袋(我知道……最近js太多了)
  • @phazei:没问题,我也做过很多次,而且我从 2000 年就开始编写 PHP!
【解决方案3】:
str_pad("",PHP_INT_MAX);

【讨论】:

    【解决方案4】:

    你可以做一个无限循环,虽然我不建议这样做。

    您还可以打开/读取超出内存限制的内存大文件,您还可以编写一个循环来生成一个字符串,其字节数将超过内存限制。

    哪个最好,不知道。但是有几个选项可供您使用。

    【讨论】:

      【解决方案5】:
      1. 下载所有谷歌地图图像。
      2. 然后使用 GD 将它们重新调整为 1-1 的比例。

      【讨论】:

        【解决方案6】:

        编写一个 PHP 函数,尝试在 /dev/random 中查找模式

        【讨论】:

          【解决方案7】:
          <?php
          $limit = ini_get('memory_limit');
          $last = strtolower($limit[strlen($limit)-1]);
          switch($last) {
              case 'g':
                  $limit *= 1024;
              case 'm':
                  $limit *= 1024;
              case 'k':
                  $limit *= 1024;
          }
          $limit = $limit + 1;//not needed actually, I assume the script has consumed 1 byte of memory by now...
          $foo = `dd if=/dev/zero bs=$limit count=1`;
          //or, if you don't like the command line:
          $bar = str_repeat($a,$limit);
          

          【讨论】:

          • 实际上,需要限制 +1。否则没有崩溃。
          • 这里有更多的开销然后是 0 字节,例如加载设置等。我很惊讶你在 PHP 脚本上有 0 字节的开销,但我当然不能与你的结果争论。
          • 使用您的脚本,我得到“允许的内存大小已用尽”错误。但我刚刚意识到,如果做一段时间(1){ $byte=$byte.$byte} 我在达到前一个错误所达到的允许限制之前很久就会收到“内存不足”错误。关于为什么的任何想法?
          • 不,不知道这两者之间的区别是什么。您可能希望在 PHP 源代码中使用 grep 来检查它们发生的条件。它可能与从外部程序获取内存有关,或者能够预测将字符串长度加倍会导致大量内存使用。虽然这里的两个错误都是相同的“用尽”一个(PHP 5.3.2)
          • 确实是 Apache 上的子进程的内存问题。 $foo 导致“内存不足”,而 $bar 导致“允许的内存耗尽”。还有 while (1) { $holder[] = str_repeat($byte,1024*1024); } 导致“内存不足”。原来这完全是因为 httpd.conf 中的 RLimitMEM 和 RLimitCPU 对子进程设置了硬内存限制。似乎 $bar 也应该导致“内存不足”错误,但由于它试图在一个步骤中分配它,所以它一定是一些可以绕过 RLimitMEM 设置的错误。
          【解决方案8】:

          我喜欢简单的解决方案,所以我经常只关注这条很有魅力的路线。

          str_repeat('a', PHP_INT_MAX);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-07
            • 2016-09-24
            • 2012-12-27
            • 2011-02-23
            • 2016-04-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多