📈sflash.biz
С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447
|
Добавлено: 14/12/14 в 19:05 |
Кто разбирается реально в php, а не только в его синтаксисе, подскажите, в каких случаях есть реальная польза от удаления массива вручную, например, unset-ом? Освобождается ли память от массивов после завершения скрипта или желательно делать unset в конце?
|
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 14/12/14 в 19:13 |
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 14/12/14 в 19:41 |
После заверщения скрипта, память всегда очищается, так как все что связано со скриптом убивается.
Но если внутри скрипта у тебя куча временных больших массивов, то советую делать
Код: |
$a ... тут массив создан и стал большим
//чистим память
$a = array();
unset($a);
|
Из за кучи изменений между пхп версиями, unset не всегда чистит память.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
8
|
|
|
+ +
WP-Master
С нами с 17.01.13
Сообщения: 1922
Рейтинг: 1123
|
Добавлено: 14/12/14 в 21:12 |
Stek: в сухосине работает.
|
|
|
|
С нами с 17.08.11
Сообщения: 61
Рейтинг: 62
|
Добавлено: 14/12/14 в 21:13 |
PHP автоматически очищает память от переменных и объектов по завершении контекста, в котором они находятся. Так, глобальные переменные очищаются при завершении выполнения сценария скрипта, локальные — при завершении выполнения функции/метода. Так что у правильно спроектированного скрипта не будет "течь" память, особенно после php 5.3.
Конструкцию unset обычно используют не для очистки памяти ради её экономии, а в таких типовых случаях, как очистка методов объекта и элеменов массивов. Либо если есть какие-нибудь большие циклы с большими временными переменными, а скрипт запущен в режиме демона.
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 14/12/14 в 23:14 |
ravlio писал: | Так что у правильно спроектированного скрипта не будет "течь" память, особенно после php 5.3. |
Как текла так и продолжает течь. Особенно на динамически создаваемых массивах и объектах.
К примеру на том же phpexcel далеко нубы сидят. А создание файлика в 300к весом, запросто под пол гига памяти сожрет. Казалось бы, что там нам 20к записей в простой worksheet запихать, где ни формул ни разметки.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
0
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 14/12/14 в 23:25 |
|
|
|
|
С нами с 17.08.11
Сообщения: 61
Рейтинг: 62
|
Добавлено: 15/12/14 в 21:49 |
Stek писал: | Как текла так и продолжает течь. Особенно на динамически создаваемых массивах и объектах.
К примеру на том же phpexcel далеко нубы сидят. А создание файлика в 300к весом, запросто под пол гига памяти сожрет. Казалось бы, что там нам 20к записей в простой worksheet запихать, где ни формул ни разметки. |
Не знаю что там за phpexcel, не работал с ним, но пусть там разработчики хоть семь пядей во лбу, это не мешает им писать прожорливые программы. Возможно особенности формата, много временных данных. Тут важно не то что объекты занимают пол-гига в памяти, а то, чтобы они потом эти пол-гига освободили после деструкции.
Утечка памяти и объем памяти, занимаемой переменными и объектами — это не одно и то же. PHP жрёт много памяти, так как у него все типы хранится в одной структуре zval, которая очень раздута (в php 7, кстати, они это дело сильно оптимизировали).
Да, возможно ещё у тебя включён xdebug с разными директивами, он даёт довольно большой оверхед.
А PHP не течёт после 5.3. Тому в подверждение проекты типа reactPHP, phpDaemon, которые работают могут работать без перебоя на огромных нагрузках. Могут течь какие-нибудь левые экстеншены — это да.
|
|
|
|
php
С нами с 09.10.06
Сообщения: 3706
Рейтинг: 2410
|
Добавлено: 28/12/14 в 20:40 |
Stek писал: | После заверщения скрипта, память всегда очищается, так как все что связано со скриптом убивается.
Но если внутри скрипта у тебя куча временных больших массивов, то советую делать
Код: |
$a ... тут массив создан и стал большим
//чистим память
$a = array();
unset($a);
|
Из за кучи изменений между пхп версиями, unset не всегда чистит память. |
Реальный пример где не чиститься? php по дефолту очищает все после интерпретации сценария.
|
|
|
|