Dier_Sergio_Great
@Dier_Sergio_Great
Увлеченный человек

Стоит ли в PHP в функциях или методах класса закрывать объявленные переменные, для экономии памяти и ЦПУ?

в посте 40 советов по оптимизации вашего PHP-кода я прочитал рекомендации под номером 5 "Удаляйте свои переменные для освобождения памяти, тем более, если это большие массивы."
.
Так вот уважаемые гуру подскажите, стоит ли удалять в функциях и методах массивы и другие переменные?
ведь по идее по завершении метода или класса переменные не видны или не доступны или удаляются.
  • Вопрос задан
  • 226 просмотров
Решения вопроса 1
index0h
@index0h
PHP, Golang. https://github.com/index0h
Если после обработки реально крупный массив, или объект уже не нужен, но метод еще не завершился - тогда стоит удалять. Правда это нужно воспринимать скорее как исключительную ситуацию. Например ниже объемная переменная $data используется всего 1 раз, а дальше просто висит в памяти до завершения метода. Тут имеет смысл ее удалить.

public function executeHugeData()
{
    $data          = $this->getDatabase()->loadHugeData();
    $convertedData = $this->getConvertor()->convert($data);
// unset($data);
    // Working with $convertedData
}


В остальных случаях - есть сборщик мусора.

--- UPD ---

Если метод может быть статическим, объявляйте его статическим.

Это приведет к бесконтрольной связности вашего проекта. Для крупных проектов - это не то, что гвоздь в их гроб, это целая стенка.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Nc_Soft
Сборщик мусора это сделает сам.
Ответ написан
Комментировать
elevenelven
@elevenelven
Php Dev @ Amadeus
Допустим у вас онлайн-магазин мобильной техники. Есть сущность $item, которая является экземпляром класса Goods.
В бизнес-модели - это товар. Мы его отобразим на странице каталога как html и больше нам ничего не надо.
Допустим наш объект занимает в памяти 500кБ. Если на странице 100 товаров, то мы уже заберем 50мБ на скрипт.
Но нам нужен экземпляр класса, только чтобы отрендерить его html. Сборщик мусора удалит объект только если на него нет больше ссылок. Но пока мы дойдём до рендера самого html мы заимеем этот $item в классе Catalog, CatalogFilter, в ORM.

Конечно надо руками чистить объекты. Это сильно снизит потребление памяти. Но на самом деле чистить надо только такие "утечки", а не всё подряд.
Ответ написан
Комментировать
puchkovk
@puchkovk
Усложнять — просто. Упрощать — сложно.
Здесь достаточно подробно описана работа с памятью в PHP
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы