У меня есть некоторые вопросы об использовании 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
Так, на основе комментариев в коде выше, вот мои вопросы:
Когда я присваиваю результаты второго запроса к $results
, что происходит с памятью, связанной с предыдущими результатами? Я должен освобождать тот результат прежде, чем присвоить новый?
Связанный с 1, когда я действительно моюсь в конце, чистка является просто последними результатами достаточно?
Когда я действительно пытаюсь очистить результат, я должен освобождать его как выше, я должен закрывать его, или оба?
Я задаю вопрос 3 потому что документация PHP для mysqli::query
имеет пример, который использует близко, даже при том, что близко не часть mysqli_result
(см. пример 1 в mysqli:: запрос). И напротив, мое нормальное использование текста ссылки PHP free
(PHP и веб-разработка MySQL, четвертый выпуск, Welling и Thomson).
Когда я присваиваю результаты второго запроса
$ results
, что происходит с память, связанная с предыдущими результатами?
Когда вы выполняете это:
$results = $db->query($query);
Если раньше в $ results
что-то было, то к этому старому содержимому больше нельзя будет получить доступ, так как есть на него не осталось ссылки.
В таком случае PHP пометит старое содержимое переменной как « больше не требуется » - и оно будет удалено из памяти, когда PHP потребуется некоторая память.
По крайней мере, это верно для общих переменных PHP; однако в случае результатов запроса SQL некоторые данные могут храниться в памяти на уровне драйвера, над которым у PHP нет особого контроля.
Должен ли я освободить этот результат перед назначением нового?
Я никогда этого не делаю, но, цитируя страницу руководства mysqli_result :: free
:
Примечание: вы всегда должны освобождать свой результат с помощью mysqli_free_result (), когда ваш объект результата больше не нужен
Это, вероятно, не имеет значения для небольшого скрипта. .. И единственный способ быть уверенным - это протестировать, используя memory_get_usage
до и после вызова этого метода, чтобы увидеть, есть ли разница или нет.
Относительно 1: когда я убираю в конце, достаточно ли убираю только последние результаты?
Когда скрипты заканчиваются:
Итак, в конце сценария, вероятно, действительно нет необходимости освобождать набор результатов.
Когда я все же пытаюсь очистить результат, должен ли я освобождать его, как указано выше, должен ли я закрывать его, или и то, и другое?
Если вы закроете соединение с база данных (используя mysqli :: close
, как вы предложили) , это отключит вас от базы данных.
Это означает, что вам придется повторно подключиться, если вы хотите выполнить другой запрос! Что совсем нехорошо (требует времени, ресурсов, ...)
Вообще говоря, я бы не закрывал соединение с базой данных, пока я действительно не уверен, что он мне больше не понадобится - это означает, что я бы не отключился до окончания сценария.
И поскольку « конец сценария » означает « соединение будет закрыто », даже если вы не укажете его; Сам почти никогда не закрываю соединение.
Общий способ PHP - не закрывать какие-либо открытые ресурсы. Все будет автоматически закрыто по окончании скрипта. Единственный случай, когда вы должны позаботиться о закрытии вручную, - это если у вас есть длинный тяжелый код для запуска, что не очень часто встречается в PHP.