Результаты запроса MySQLi: Лучше всего приблизьтесь, Вы закрываете, освобождаете, оба?

У меня есть некоторые вопросы об использовании MySQLi, запросов и связанного управления памятью. Код здесь является просто для уточнения моими вопросами, не выводите на нем для проверки ошибок и т.д. Я знаю что потребности быть сделанным :)

Предположим, что у меня есть что-то вроде этого:

@ $db = new mysqli($dbhost, $un, $ps, $dbname);
$query = "SELECT field1, field2 ".
         "FROM table1 ".
         "WHERE field1={$some_value}";
$results = $db->query($query);

while ($result = $results->fetch_object()) {
    // Do something with the results
}

$query = "SELECT field1, field2 ".
         "FROM table2 ".
         "WHERE field1={$some_value2}";
// question 1
$results = $db->query($query);

while ($result = $results->fetch_object()) {
    // Do something with the second set of results
}

// Tidy up, question 2
if ($results) {
    $results->free();
}
if ($db) {
    $db->close();
}

// Question 3, a general one

Так, на основе комментариев в коде выше, вот мои вопросы:

  1. Когда я присваиваю результаты второго запроса к $results, что происходит с памятью, связанной с предыдущими результатами? Я должен освобождать тот результат прежде, чем присвоить новый?

  2. Связанный с 1, когда я действительно моюсь в конце, чистка является просто последними результатами достаточно?

  3. Когда я действительно пытаюсь очистить результат, я должен освобождать его как выше, я должен закрывать его, или оба?

Я задаю вопрос 3 потому что документация PHP для mysqli::query имеет пример, который использует близко, даже при том, что близко не часть mysqli_result (см. пример 1 в mysqli:: запрос). И напротив, мое нормальное использование текста ссылки PHP free (PHP и веб-разработка MySQL, четвертый выпуск, Welling и Thomson).

35
задан Vadim Kotov 17 August 2017 в 14:11
поделиться

2 ответа

Когда я присваиваю результаты второго запроса $ results , что происходит с память, связанная с предыдущими результатами?

Когда вы выполняете это:

$results = $db->query($query);

Если раньше в $ results что-то было, то к этому старому содержимому больше нельзя будет получить доступ, так как есть на него не осталось ссылки.

В таком случае PHP пометит старое содержимое переменной как « больше не требуется » - и оно будет удалено из памяти, когда PHP потребуется некоторая память.

По крайней мере, это верно для общих переменных PHP; однако в случае результатов запроса SQL некоторые данные могут храниться в памяти на уровне драйвера, над которым у PHP нет особого контроля.


Должен ли я освободить этот результат перед назначением нового?

Я никогда этого не делаю, но, цитируя страницу руководства mysqli_result :: free :

Примечание: вы всегда должны освобождать свой результат с помощью mysqli_free_result (), когда ваш объект результата больше не нужен

Это, вероятно, не имеет значения для небольшого скрипта. .. И единственный способ быть уверенным - это протестировать, используя memory_get_usage до и после вызова этого метода, чтобы увидеть, есть ли разница или нет.


Относительно 1: когда я убираю в конце, достаточно ли убираю только последние результаты?

Когда скрипты заканчиваются:

  • Соединение с база данных будет закрыта - это означает, что любая память, которая может быть использована драйвером, должна быть освобождена
  • Все переменные, используемые сценарием PHP, будут уничтожены - это означает, что память, которую они использовали, должна быть освобождена.

Итак, в конце сценария, вероятно, действительно нет необходимости освобождать набор результатов.


Когда я все же пытаюсь очистить результат, должен ли я освобождать его, как указано выше, должен ли я закрывать его, или и то, и другое?

Если вы закроете соединение с база данных (используя mysqli :: close , как вы предложили) , это отключит вас от базы данных.

Это означает, что вам придется повторно подключиться, если вы хотите выполнить другой запрос! Что совсем нехорошо (требует времени, ресурсов, ...)

Вообще говоря, я бы не закрывал соединение с базой данных, пока я действительно не уверен, что он мне больше не понадобится - это означает, что я бы не отключился до окончания сценария.

И поскольку « конец сценария » означает « соединение будет закрыто », даже если вы не укажете его; Сам почти никогда не закрываю соединение.

54
ответ дан 27 November 2019 в 07:01
поделиться

Общий способ PHP - не закрывать какие-либо открытые ресурсы. Все будет автоматически закрыто по окончании скрипта. Единственный случай, когда вы должны позаботиться о закрытии вручную, - это если у вас есть длинный тяжелый код для запуска, что не очень часто встречается в PHP.

-2
ответ дан 27 November 2019 в 07:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: