Есть переменная-строка, содержащая "длинный" текст. (Ну, пусть 50 — 100 кБ.)
Имеет ли смысл делать unset($переменная) после работы с ней с целью освобождения занимаемой ею памяти для др. переменных при обработке php-сценария?
А может, есть где почитать на русском про то, как php работает с памятью? То, что в нём нет GC с его кучей, и память отобранная сценарием, будет отпущена по завершении оного — вроде, очевидно.
Вопрос в контексте горячо любимых хостерами ограничений на ресурсы per всё подряд.
... << RSDN@Home 1.2.0 alpha rev. 659>> SQL Express 2005
Здравствуйте, akasoft, Вы писали:
A>А может, есть где почитать на русском про то, как php работает с памятью? То, что в нём нет GC с его кучей, и память отобранная сценарием, будет отпущена по завершении оного — вроде, очевидно.
Думаю, что только в исходниках...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Вот, решил проверить.
<?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>>
Здравствуйте, 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