2013-02-26 3 views
3

Я использую страницу для запросов ajax и внутри нее добавляю exit(); чтобы остановить загрузку шаблона, поскольку это запрос ajax.Результат функции php exit() для утечки памяти

Проблема заключается в том, что каждый раз я добавляю 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. 

В чем проблема? Как я могу освободить память при выходе? Помогите пожалуйста Спасибо!

+2

Вы никогда не добираетесь до второго 'memory_get_usage();' потому что вы вышли из сценария. – HamZa

+3

Память автоматически освобождается при завершении скрипта, однако многое было использовано во время выполнения скрипта. –

+0

. Вы проверяете использование памяти * перед * 'exit'. Все, что после этого (включая 'exit') не повлияет на него. – Mike

ответ

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, чтобы получить лучшее представление о том, что происходит.

+0

Да, это часть проблемы, и основной причиной является незакрытый ob_start(); и $ _SESSION является его частью. в моем методе render() моего класса шаблонов. Большое спасибо! я дал вам зеленый чек :) –

2

Это, кажется, известный аспект PHP и, по мнению людей, обладающих определенными знаниями, чем я, он преднамерен. Кто-то было точно таким же вопрос (http://comments.gmane.org/gmane.comp.php.devel/77918) и оказывается, что они делают это нарочно:

We do have some intentional leaks where we rely on the pool allocator to wipe things at the end of a request. So I am less concerned about things you see at request termination than I would be if you found one mid-request.

Надеется, что это светит свет на ваш вопрос.

+0

Спасибо ZolrleQ. il проверить это. :) –

+0

Привет ZorleQ вы предложили рамки zend и настройку рамки zend. Я не использую zend :) –

+0

Я бы ожидал, что это будет точно такой же принцип. – ZorleQ

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; 

, а затем из них работает, где использование памяти начинается восхождение

+0

Привет, Джеймс, на самом деле запрос сначала переносится на индекс корневой страницы..php и включает mypage.php, поэтому перед вызовом memory_get_usage() есть сценарии и распределения памяти. Спасибо чувак! –

+1

Спасибо за предложение! –

0

Парни Спасибо за помощь, я действительно ценю это. Мне повезло, что я нашел проблему. Вероятно, это метод render() моего класса шаблонов, который содержит ob_start(). Поэтому, когда функция exit() вызывается в mypage.php (которая включена в render()). выходной буфер может быть исчерпан. Я не уверен, что это может быть проблемой, но я смог решить проблему, изменив последовательность выполнения template-> render();

Спасибо, ребята!

+0

Вероятно, перед 'exit' возможно потребуется [' ob_end_clean'] (http://php.net/manual/en/function.ob-end-clean.php). – ACJ

+0

@ACJ да, что тоже работает. –

+0

Решение состоит в создании вашей собственной глобальной функции «CleanExit», которая автоматически опустошает все буферы и вызовы. – ZorleQ

Смежные вопросы