php exit()函数导致内存泄漏

时间:2013-02-26 23:47:53

标签: php

我正在使用ajax请求的页面,在其中我添加了exit();函数停止加载模板,因为它是一个ajax请求。

问题是我每次添加exit()都没有释放内存。我检查了这样的记忆:

//mypage.php
echo memory_get_usage(); exit(); // This results to memory to climb up for every page refresh.
===============================
//mypage.php
echo memory_get_usage(); // The memory is ok

//For clarification the above codes are executed at different times.

可能是什么问题?如何在退出时释放内存?请帮助谢谢!

4 个答案:

答案 0 :(得分:2)

这似乎是PHP的一个已知方面,并且根据比我更多的知识的人,它是有意的。有人有一个完全相同的问题(http://comments.gmane.org/gmane.comp.php.devel/77918),事实证明他们是故意这样做的:

  

我们确实有一些故意泄漏,我们依赖池分配器   在请求结束时擦除东西。所以我不太关心   你在请求终止时看到的东西比我找到的东西要多   中间请求。

希望这能为你的问题提供一些启示。

答案 1 :(得分:1)

我能够重现错误的唯一方法是在$_SESSION中存储一个值,并且每次都将其长度加倍。这是我的代码:

<?php

session_start();

if (!isset($_SESSION['test'])) {
    $_SESSION['test'] = 'abcdefghij';
}
else {
    $_SESSION['test'] .= $_SESSION['test'];
}
$_SESSION['memory'][] = memory_get_usage();

print_r($_SESSION['memory']);
exit;

刷新页面24次之后,我终于让它耗尽内存:

Array
(
    [0] => 231768
    [1] => 232088
    [2] => 232248
    [3] => 232424
    [4] => 232640
    [5] => 232728
    [6] => 233200
    [7] => 233984
    [8] => 235376
    [9] => 238136
    [10] => 243392
    [11] => 253768
    [12] => 274384
    [13] => 315480
    [14] => 397536
    [15] => 561512
    [16] => 889328
    [17] => 1544952
    [18] => 2855808
    [19] => 5477384
    [20] => 10720400
    [21] => 21206296
    [22] => 42177952
    [23] => 84121128
)
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 83886344 bytes) in Unknown on line 0

您可以看到每次刷新页面时内存使用量都会增加。

当您告诉PHP exit时,它不会在您的代码中执行任何进一步的操作。我的猜测是在你做exit之后的某个地方,你也做了类似的事情:

$_SESSION['test'] = 'something else';

当您exit页面时,这将不会被执行,因此会将其抛入指数递增的循环,每次都会增加内存使用量。如果您找不到这样的内容,我建议您查看Xdebug以更好地了解正在发生的事情。

答案 2 :(得分:0)

我认为你错了导致内存泄漏的原因。如果您尝试将代码修改为以下内容,则会在exit调用后看到没有任何内容运行。

echo memory_get_usage(); exit(); // This results to memory to climb up for every page refresh.

echo "I will never echo". PHP_EOL;
echo memory_get_usage(); // The memory is ok

为了正确调试,我建议在所有内联调试中包含一些额外的调试上下文,如下所示:

echo "before database call: ". memory_get_usage() . PHP_EOL;

然后从他们那里找出内存使用开始攀升的地方

答案 3 :(得分:0)

伙计们感谢您的帮助,我真的很感激。我很幸运,我找到了这个问题。它可能是我的Template类的render()方法,它包含ob_start()。所以当在mypage.php中调用exit()函数时(包含在render()中)。输出缓冲区可能已耗尽。我不确定这可能是问题,但我能够通过改变执行模板的顺序来解决问题 - &gt; render();

谢谢你们!

相关问题