Использование MySQLi - что лучше для закрытия запросов
Вопрос
У меня есть привычка сводить использование моих переменных к минимуму.Поэтому мне интересно, есть ли какое-либо преимущество, которое можно получить от следующего:
$query = $mysqli->query('SELECT * FROM `people` ORDER BY `name` ASC LIMIT 0,30');
// Example 1
$query = $query->fetch_assoc();
// Example 2
$query_r = $query->fetch_assoc();
$query->free();
Теперь, если я прав, Пример 1 должен быть более эффективным, поскольку $query
является unset
когда я переназначаю его, это должно освободить любую память, связанную с ним.Однако есть способ (MySQLi_Result::free()
) который освобождает связанную память - это одно и то же?
Если я не позвоню ::free()
чтобы освободить любую память, связанную с результатом, но unset
это путем переназначения переменной я делаю то же самое?Я не знаю, как регистрировать подобные вещи - у кого-нибудь есть какие-нибудь идеи?
Решение
Тот Самый руководство пользователя кажется, это наводит на мысль, что вы все еще должны использовать free()
чтобы освободить память.Я полагаю, что причина в том, что free()
освобождает память в MySQL, не в PHP.Поскольку PHP не может собирать мусор для MySQL, вам нужно вызвать free()
.
Другие советы
Пример 1 диссоциирует переменная $query из результата MySQL.Результат MySQL все еще существует в памяти и будет продолжать существовать и тратить память впустую до тех пор, пока не произойдет сборка мусора.
Пример 2 освобождает MySQL выдает результат немедленно, освобождая использованные ресурсы.
Однако, поскольку страницы PHP, как правило, недолговечны с небольшими наборами результатов, экономия памяти тривиальна.Вы не заметите замедления, пока не уйдете тонна результатов в памяти за длительный период времени на страницах, которые выполняются в течение длительного времени.
Брайан, PHP может мусор собирает результат MySQL, просто это происходит не сразу.Результат хранится в пуле памяти PHP, а не на сервере MySQL.
(локальность памяти при использовании небуферизованных запросов немного отличается, но они настолько редко используются в PHP, что не заслуживают упоминания)