PHP达到内存限制会导致函数重新运行

时间:2009-04-21 21:03:02

标签: php zend-framework memory

所以我有一个非常奇怪的问题。

首先,我使用PHP 5.2.6(作为MAMP的一部分,虽然这也发生在运行5.2.6的LAMP服务器上),使用Zend Framework 1.7.2编写一个网站。

其次,我正在编写的软件执行相当复杂的统计计算,需要大量内存。通常它运行正常,128MB设置为内存限制。

所以这是有趣的部分。

我有一个专门负责获取所需数据的类,进行所需的计算,然后返回值。在运行之后,我一直在解开它,因为PHP似乎认为它仍然在范围内并且为它保留了内存,尽管它完成了调用它的功能(这导致了第二次运行计算的问题达到内存限制并且脚本死了)。在该函数内运行一次该计算后,它将在另一个函数中再次运行以进行另一次计算(这是在同一执行运行期间)。这就是事情变得奇怪的地方。

如果我运行第二次计算,则调用函数会再次运行,尽管事实上在执行此计算的代码中绝对没有调用该函数。此外,PHP中不会出现任何错误或警告。

但是,如果我增加内存限制(例如,增加到1024 MB),就不会发生。整个调用函数运行一次并继续沿着它的快乐方式。

所以,让我在下面画一张地图。

function A{
   calls function B
   calls function D
}

function B{
   calls calculation function C
}

function D{
   calls calculation function C
}

128 MB内存,功能路径如下(进入和返回调用者): A-> B-> C-> B-> A-> D-> C-> D->然后它从函数的开始运行A,由于某种原因,到最后(有一个条件情况在此执行路径期间变为true,因此路径不会重复)

具有1GB内存,功能路径如下: A-> B-> C-> B-> A-> D-> C-> D-> A的末端,这是应该发生的。

如果我从函数D中删除第二个计算,它可以工作。如果我提高内存限制,它就可以工作。

问题是:我在PHP内存管理中发现了一个错误吗?或者也许在Zend框架中?再次;通过增加php.ini中每个脚本的内存限制,我没有看到这个问题。那,或者删除运行这个使用大量内存的计算的第二个实例。

我非常非常确定这是它发生的方式,尽管它的方式很奇怪(我从未见过这种跳回到调用函数的开始)。通常在这种情况下会发生的事情是PHP会出错并死掉,而不是重新启动调用函数。

2 个答案:

答案 0 :(得分:1)

您是否使用debug_backtrace()验证了程序流程?我认为你的PHP代码更可能是zend引擎的原因。我建议在每个函数开始时将跟踪转储放入文件中并首先分析:

function myFunction() {
    file_put_contents(print_r(debug_backtrace(), true) . "\n--\n", 'trace.txt');
    //...

答案 1 :(得分:0)

首先,启用所有error reporting,包括E_STRICT。

我怀疑低内存会导致你没有预料到的执行路径,也许额外的错误输出会带来更多的亮光。

相关问题