2012-06-22 3 views
1

Нужно ли беспокоиться о утечке памяти с помощью PHP? В частности, у меня есть следующий код, который вызывается из браузера. Когда вызов заканчивается, все правильно очищено или мне нужно очистить память, созданную первым массивом, который был создан?PHP Управление памятью и массивы

class SomeClass 
{ 
    var $someArray = array(); 

    function someMethod() 
    { 
    $this->someArray[1] = "Some Value 1"; 
    $this->someArray[2] = "Some Value 2"; 
    $this->someArray[3] = "Some Value 3"; 
    $this->someArray = array(); 
    $this->someArray[1] = "Some other Value"; 
    $this->someArray[2] = "Some other Value"; 
    $this->someArray[3] = "Some other Value"; 
    } 
} 

someMethod(); 

Спасибо, Скотт

+2

Каждый вызов скрипта запускает новый процесс PHP. Между этими вызовами теряется вся память. – mario

ответ

3

Нужно ли беспокоиться о утечке памяти с помощью PHP?

Можно иметь циклическую ссылку на PHP, где refcount из zval никогда не падает до 0. Это вызовет утечку памяти (GC не будет очищать объекты, имеющие ссылку на них). Это было исправлено в> = PHP 5.3.

В частности, у меня есть следующий код, который вызывается из браузера. Когда вызов заканчивается, все правильно очищено или мне нужно очистить память, созданную первым массивом, который был создан?

PHP скрипты имеют запрос жизненный цикл (приложение запуска, вернуть ответ, близко приложение) с, так что не следует беспокоиться. Вся память, используемая вашим приложением, должна быть отмечена как free'd, когда ваше приложение заканчивается, готовое к перезаписыванию следующего запроса.

+1

Я считаю, что с PHP 5.3 проблема циклической ссылки была исправлена. – Corbin

+0

@Corbin Вы правы, только что нашли это в некоторых [слайдах] (http://www.slideshare.net/phpcodemonkey/whats-new-whats-hot-in-php-53). Я сделаю редактирование. – alex

1

Если вы супер параноик, вы можете всегда unset вещи, однако, PHP является сбор мусора язык означает, что, если не существует ошибка в ядре или в насадке , никогда не будет утечки памяти.

More information


На стороне записки, вы должны использовать новую PHP 5 синтаксис объектно-ориентированного программирования. И, someMethod будет ошибкой. Он должен быть $ obj-> someMethod(), где $ obj - это экземпляр класса.

+0

Отлично. Спасибо ... –

1

На самом деле существуют проблемы с памятью, если вы запускаете mod_php через Apache с поведением mpm_prefork. Проблема в том, что память, потребляемая PHP, не возвращается в операционную систему. Тот же процесс Apache может повторно использовать память для последующих запросов, но не может использоваться другими программами (даже не для других процессов Apache).

Одно из решений - время от времени перезапускать процессы, например, установив параметр MaxRequestsPerChild на что-то довольно низкое (100 или около того, возможно, ниже для легко загружаемых серверов). Лучшее решение - не использовать mod_php вообще, а вместо этого запускать PHP через FastCGI.

Это вопрос с системным администратором, хотя и не проблема программиста.

+0

+1 хорошо знать – alex

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