【发布时间】:2015-07-16 00:10:51
【问题描述】:
我遇到的问题很奇怪。它发生在进行递归循环时。使用 for 循环或任何其他迭代执行相同任务时不会发生这种情况。
当递归调用一个函数低于约 21 000 次时,一切正常。执行此号码时出现问题。
我的工作代码:
foo();
function foo($i = 1) {
if ($i > 20000) {
return;
}
echo $i . '<br/>';
foo($i + 1);
return;
}
输出:
...
19998
19999
20000
不工作的代码:
foo();
function foo($i = 1) {
if ($i > 30000) { // Or any number above ~21000
return;
}
echo $i . '<br/>';
foo($i + 1);
return;
}
输出:
...
13493
13494
13
最后一行停在数字的中间。
在某些情况下,它只是向服务器发送一个空响应。
我在 Ubuntu 上使用 PHP 版本 5.6.10 的 apache2 服务器。使用 Xampp 也会出现同样的问题,只是数字略有不同。
【问题讨论】:
-
听起来像是内存问题。尝试更改您的最大内存设置,重新启动 Apache,然后再次运行您的代码。
-
是否存在需要 30K 递归调用的真实场景?听起来简单的循环会在这里更有效地解决问题。
-
每个脚本允许使用多少内存?我认为默认值为 128,因此您可能希望将其更改为 256,如果您认为需要,可能会更高。检查你的 PHP ini 是否有“memory_limit”
-
增加 xdebug.max_nesting_level。在这里查看答案stackoverflow.com/questions/17488505/…
-
执行时间呢?还是输出缓冲区?