[php] unset() "освобожает" память?
От: akasoft Россия  
Дата: 01.11.06 18:20
Оценка:
Есть переменная-строка, содержащая "длинный" текст. (Ну, пусть 50 — 100 кБ.)

Имеет ли смысл делать unset($переменная) после работы с ней с целью освобождения занимаемой ею памяти для др. переменных при обработке php-сценария?

А может, есть где почитать на русском про то, как php работает с памятью? То, что в нём нет GC с его кучей, и память отобранная сценарием, будет отпущена по завершении оного — вроде, очевидно.

Вопрос в контексте горячо любимых хостерами ограничений на ресурсы per всё подряд.
... << RSDN@Home 1.2.0 alpha rev. 659>> SQL Express 2005
Re: [php] unset() "освобожает" память?
От: kost-BebiX Украина http://fedorastones.blogspot.com
Дата: 02.11.06 19:24
Оценка:
Здравствуйте, akasoft, Вы писали:

A>А может, есть где почитать на русском про то, как php работает с памятью? То, что в нём нет GC с его кучей, и память отобранная сценарием, будет отпущена по завершении оного — вроде, очевидно.


Думаю, что только в исходниках...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Если программист в рабочее время играет, значит —
либо у него мало работы и большая зарплата,
либо у него много работы и маленькая зарплата.
Re[2]: [php] unset() "освобожает" память?
От: kost-BebiX Украина http://fedorastones.blogspot.com
Дата: 02.11.06 19:26
Оценка: 6 (1)
Вот, решил проверить.

    <?php
        define('ROOT_DIR', getcwd());
        
    ini_set('html_errors', FALSE);
    ini_set('implicit_flush', TRUE);
    ini_set('max_execution_time', 0);
    ini_set('register_argc_argv', TRUE);
        
    $stdin = fopen('php://stdin', 'r');
    $stdout = fopen('php://stdout', 'w');
    $stderr = fopen('php://stderr', 'w');
        
        echo "Enter some string to start...\n";
    $_temp = fgets($stdin);
    echo "Getting a big file into memory...\n";
    $somevar = file_get_contents('bigfile');
    echo "Enter a string to unset the var";
    $_temp = fgets($stdin);
    unset($somevar);
    echo "Var has been successfully unsetted :D\n";
    $_temp = fgets($stdin);
    echo "Done-->\n";


Запускаем что-то типо того (под винду):
d:\php\php-cgi.exe memorytest.php

Ctrl+Alt+Del -> Быстродействие

Видим, что память освобождается сразу после unset'а.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Если программист в рабочее время играет, значит —
либо у него мало работы и большая зарплата,
либо у него много работы и маленькая зарплата.
Re[3]: [php] unset() "освобожает" память?
От: akasoft Россия  
Дата: 04.11.06 15:51
Оценка:
Здравствуйте, kost-BebiX, Вы писали:

KB>Запускаем что-то типо того (под винду):


Меня больше юникс-системы интересуют.

Например, у Энди Гутманса со товарищи в разделе 2.4.2.2. написано:

Функция unset() предназначена для удаления предварительно объявленных переменных и освобождения занимаемой ими памяти при условии, что на эту область памяти не ссылается никакая другая переменная. Для удалённой переменной функция isset() вернёт false.
...
Кроме того, функция unset() может применяться к элементам массивов и свойствам объектов аналогично функции isset().


Таким образом я делаю вывод, что для глобальных переменных удобненько не заводить новые переменные, а ре-использовать существующие в тех же итерациях с большими фрагментами данных. Типа, выборки из БД или генерации страниц по шаблонам фрагментов. Чем меньше переменных, тем меньше затраты на память.

Т.е. переменные-счётчики i, j, k, строки s и пр. "любимые" безликие имена...

Типа, такой подход бездарно расходует память, при условии, что для сборки последующего темплейта нужен только предыдущий:

s1 = loadTemplate('1');
s2 = loadTemplate('2');
s3 = loadTemplate('3');
s4 = loadTemplate('main');
return s4;


А так, типа, экономия:

s = loadTemplate('1');
s = loadTemplate('2');
s = loadTemplate('3');
s = loadTemplate('main');
return s;


А вот для локальных и свойств объектов не совсем ясно — освобождаются ли локальные переменные по выходу из тела функции или как? Или unset() надо делать. Логично было бы, если освобождались. Так в идеологию работы php с переменными бы вписывалось.

А с объектами — в деструкторе надо свойства чекрыжить или не надо. По логике — надо чекрыжить самому в деструкторе. Речь о "больших" переменных, конечно. Мелочь всё равно порубится по завершении сценария.
... << RSDN@Home 1.2.0 alpha rev. 659>> SQL Express 2005
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.