Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: PHP - уничтожение массивов вручную и экономия
цитата
14/12/14 в 19:05
 S_Flash
Кто разбирается реально в php, а не только в его синтаксисе, подскажите, в каких случаях есть реальная польза от удаления массива вручную, например, unset-ом? Освобождается ли память от массивов после завершения скрипта или желательно делать unset в конце?
цитата
14/12/14 в 19:41
 Stek
После заверщения скрипта, память всегда очищается, так как все что связано со скриптом убивается.

Но если внутри скрипта у тебя куча временных больших массивов, то советую делать
Код:

$a ... тут массив создан и стал большим

//чистим память
$a = array();
unset($a);


Из за кучи изменений между пхп версиями, unset не всегда чистит память.
цитата
14/12/14 в 21:12
 Дартаньян
Stek: trollface.png в сухосине работает.
цитата
14/12/14 в 21:13
 ravlio
PHP автоматически очищает память от переменных и объектов по завершении контекста, в котором они находятся. Так, глобальные переменные очищаются при завершении выполнения сценария скрипта, локальные — при завершении выполнения функции/метода. Так что у правильно спроектированного скрипта не будет "течь" память, особенно после php 5.3.

Конструкцию unset обычно используют не для очистки памяти ради её экономии, а в таких типовых случаях, как очистка методов объекта и элеменов массивов. Либо если есть какие-нибудь большие циклы с большими временными переменными, а скрипт запущен в режиме демона.
цитата
14/12/14 в 23:14
 Stek
ravlio писал:
Так что у правильно спроектированного скрипта не будет "течь" память, особенно после php 5.3.

Как текла так и продолжает течь. Особенно на динамически создаваемых массивах и объектах.
К примеру на том же phpexcel далеко нубы сидят. А создание файлика в 300к весом, запросто под пол гига памяти сожрет. Казалось бы, что там нам 20к записей в простой worksheet запихать, где ни формул ни разметки.
цитата
14/12/14 в 23:25
 Ailk
ну это вроде как стало решаемо после 5.3
http://php.net/manual/ru/features.gc.collecting-cycles.php
цитата
15/12/14 в 21:49
 ravlio
Stek писал:
Как текла так и продолжает течь. Особенно на динамически создаваемых массивах и объектах.
К примеру на том же phpexcel далеко нубы сидят. А создание файлика в 300к весом, запросто под пол гига памяти сожрет. Казалось бы, что там нам 20к записей в простой worksheet запихать, где ни формул ни разметки.

Не знаю что там за phpexcel, не работал с ним, но пусть там разработчики хоть семь пядей во лбу, это не мешает им писать прожорливые программы. Возможно особенности формата, много временных данных. Тут важно не то что объекты занимают пол-гига в памяти, а то, чтобы они потом эти пол-гига освободили после деструкции.

Утечка памяти и объем памяти, занимаемой переменными и объектами — это не одно и то же. PHP жрёт много памяти, так как у него все типы хранится в одной структуре zval, которая очень раздута (в php 7, кстати, они это дело сильно оптимизировали).

Да, возможно ещё у тебя включён xdebug с разными директивами, он даёт довольно большой оверхед.

А PHP не течёт после 5.3. Тому в подверждение проекты типа reactPHP, phpDaemon, которые работают могут работать без перебоя на огромных нагрузках. Могут течь какие-нибудь левые экстеншены — это да.
цитата
28/12/14 в 20:40
 _s_[sov]
Stek писал:
После заверщения скрипта, память всегда очищается, так как все что связано со скриптом убивается.

Но если внутри скрипта у тебя куча временных больших массивов, то советую делать
Код:

$a ... тут массив создан и стал большим

//чистим память
$a = array();
unset($a);


Из за кучи изменений между пхп версиями, unset не всегда чистит память.


Реальный пример где не чиститься? php по дефолту очищает все после интерпретации сценария.


Эта страница в полной версии