topol
Новичок
Здравствуйте!
Хотел бы предупредить, я не программист. Возможно, мои вопросы покажется нелепыми.
В документации сказано, что для очистки памяти от результата запроса необходимо выполнить mysqli_free_result()
Также в документации сказано:
Правильно ли, я понимаю, что если я перезапишу или уничтожу переменную содержащую результат запроса, память освободится автоматически?
Вопрос 2:
Если я сразу считываю данные из результата, не создавая промежуточную переменную, освобождается ля память автоматически?
Примеры:
Получаем сразу массивы с данными.
Т.е. mysqli_free_result() мы уже не сможем ни к чему применить.
Для проверки своих суждений сделал тест:
Из таблицы, содержащей 3 млн. строк (~1 ГБ), выбирал поочередно все данные:
Через top наблюдал за потреблением памяти. В результате работы скрипта, потребление памяти процессом не изменялось.
Вопрос 3:
Если мои суждения верны, тогда зачем выполнять $result->free(), если можно написать $result = 0, либо вообще ни чего не писать, если переменная $result будет перезаписана в другом запросе?
Вопрос 4:
Почему, во всех примерах, результат записывают в промежуточную переменную
когда можно можно написать сразу
Заранее, спасибо, за ответ.
Хотел бы предупредить, я не программист. Возможно, мои вопросы покажется нелепыми.
В документации сказано, что для очистки памяти от результата запроса необходимо выполнить mysqli_free_result()
Также в документации сказано:
Вопрос 1:Освобождение ресурсов
Благодаря системе подсчета ссылок, введенной в PHP 4 Zend Engine, определение отсутствия ссылок на ресурс происходит автоматически, после чего он освобождается сборщиком мусора. Поэтому, очень редко требуется освобождать память вручную.
Правильно ли, я понимаю, что если я перезапишу или уничтожу переменную содержащую результат запроса, память освободится автоматически?
Вопрос 2:
Если я сразу считываю данные из результата, не создавая промежуточную переменную, освобождается ля память автоматически?
Примеры:
PHP:
$a = $db->query('SELECT * FROM `t1` LIMIT 0, 1')->fetch_assoc();
$b = $db->query('SELECT * FROM `t1` LIMIT 0, 10')->fetch_all();
Т.е. mysqli_free_result() мы уже не сможем ни к чему применить.
Для проверки своих суждений сделал тест:
Из таблицы, содержащей 3 млн. строк (~1 ГБ), выбирал поочередно все данные:
PHP:
for($i=0;$i<3000000;$i++) {
$a = $db->query('SELECT * FROM `t1` LIMIT ' . $i . ', 1')->fetch_assoc(); // сразу возвращает результат в виде массива
$result = $db->query('SELECT * FROM `t1` LIMIT ' . $i . ', 1'); // $result будет перезаписана при следующей итерации
}
Вопрос 3:
Если мои суждения верны, тогда зачем выполнять $result->free(), если можно написать $result = 0, либо вообще ни чего не писать, если переменная $result будет перезаписана в другом запросе?
Вопрос 4:
Почему, во всех примерах, результат записывают в промежуточную переменную
PHP:
$result = $db->query('SELECT * FROM `t1` LIMIT 0, 1');
$a = $result->fetch_assoc();
$result->free();
PHP:
$a = $db->query('SELECT * FROM `t1` LIMIT 0, 1')->fetch_assoc();
Заранее, спасибо, за ответ.