Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
PHP - уничтожение массивов вручную и экономия
Новая тема
Ответить
цитата
14/12/14 в 19:05
S_Flash
Кто разбирается реально в php, а не только в его синтаксисе, подскажите, в каких случаях есть реальная польза от удаления массива вручную, например, unset-ом? Освобождается ли память от массивов после завершения скрипта или желательно делать unset в конце?
цитата
14/12/14 в 19:13
Ailk
http://habrahabr.ru/post/134784/
цитата
14/12/14 в 19:41
Stek
После заверщения скрипта, память всегда очищается, так как все что связано со скриптом убивается.
Но если внутри скрипта у тебя куча временных больших массивов, то советую делать
Код:
$a ... тут массив создан и стал большим
//чистим память
$a = array();
unset($a);
Из за кучи изменений между пхп версиями, unset не всегда чистит память.
цитата
14/12/14 в 21:12
Дартаньян
Stek:
в сухосине работает.
цитата
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 по дефолту очищает все после интерпретации сценария.
Новая тема
Ответить
Эта страница в полной версии