У меня есть привычка сводить использование переменных к минимуму. Поэтому мне интересно, можно ли получить какое-либо преимущество от следующего:
$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, что о них не стоит упоминать)