PHP 8.1.0 RC 4 available for testing

Буферизированные и небуферизированные запросы

По умолчанию запросы используют режим буферизации. Это значит, что результаты запроса немедленно поступают от сервера MySQL к PHP и сохраняются в памяти PHP-процесса. Это позволяет делать дополнительные операции, такие как подсчёт количества строк и перемещение (поиск) текущего указателя результата. Это также даёт возможность выполнять новые запросы в том же соединении во время работы над результатом последнего запроса. Недостаток режима буферизации является то, что большие наборы результатов могут потребовать довольно много количество оперативной памяти. Память остаётся занятой до тех пор, пока все указатели на результирующий набор не будут удалены или результирующий набор не будет явно освобождён, что автоматически происходит во время окончания последнего запроса. Термин "результат сохранения" ("store result") также используется для режима буферизации, так как весь результирующий набор сохраняется сразу.

Замечание:

При использовании libmysqlclient в качестве библиотеки ограничение памяти PHP не будет учитывать память используемую для результирующих наборов, если данные не будут сохранены в переменные PHP. С mysqlnd учёт памяти также будет включать в себя размер результирующего набора.

Небуферизированные MySQL запросы выполняются и возвращают resource, пока данные ожидают получения на сервере MySQL. Это использует меньше памяти на стороне PHP, но может увеличить нагрузку на сервер. Пока полный результирующий набор не будет передан с сервера, никакие дальнейшие запросы не могут быть отправлены через это же соединение. Небуферизированные запросы также могут быть отложены как "use result".

Следующие характеристики буферизированных запросов должны быть использованы в случаях, когда вы ожидаете только ограниченный результирующий набор или хотите знать количество возвращаемых строк до прочтения всех строк. Небуферизированный режим должен быть использован если вы ожидаете большие размеры результирующих наборов.

Поскольку буферизированные запросы применяются по умолчанию, следующие примеры продемонстрируют как выполнить небуферизированные запросы в каждом из API

Пример #1 Пример небуферизированного запроса: mysqli

<?php
$mysqli  
= new mysqli("localhost""my_user""my_password""world");
$uresult $mysqli->query("SELECT Name FROM City"MYSQLI_USE_RESULT);

if (
$uresult) {
   while (
$row $uresult->fetch_assoc()) {
       echo 
$row['Name'] . PHP_EOL;
   }
}
?>

Пример #2 Пример небуферизированного запроса: pdo_mysql

<?php
$pdo 
= new PDO("mysql:host=localhost;dbname=world"'my_user''my_pass');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERYfalse);

$uresult $pdo->query("SELECT Name FROM City");
if (
$uresult) {
   while (
$row $uresult->fetch(PDO::FETCH_ASSOC)) {
       echo 
$row['Name'] . PHP_EOL;
   }
}
?>
add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top