PHP 7, mysqli, ссылка: Пример использования bind_result против get_result
я использую небуферизованная загрузка (Надеюсь) и удивляюсь по поводу потребления памяти $m
, Поскольку я только получаю (тестовый пример), я ожидал бы память $m
быть почти постоянным. Но это не так, в зависимости от того, сколько строк я выбираю, оно увеличивается. Я ожидаю, что результат выборки работает как курсор, получая только 1 строку за раз.
Как бы я этого достиг (читая по 1 строке за раз)?
Замечание: здесь https://stackoverflow.com/a/14260423/356726 они используют
$uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);
но я не нашел способ пройти MYSQLI_USE_RESULT
где-то в готовом заявлении.
$result = $stmt->get_result(); // not stored I hope
$i = 0;
while ($row = $result->fetch_assoc()) {
$i++;
if ($i > 20000) {
break;
}
}
$m = memory_get_usage(); // see values between 10-50MB here, depending on i
$this->freeAndCloseStatement($stmt);
В документации Mysql есть пример, поэтому вы не должны указывать в качестве параметра, просто запустите метод.
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* execute multi query */
if ($mysqli->multi_query($query)) {
do {
/* store first result set */
if ($result = $mysqli->use_result()) { //<----------- THIS LINE
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
$result->close();
}
/* print divider */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());
}
/* close connection */
$mysqli->close();
?>
https://dev.mysql.com/doc/apis-php/en/apis-php-mysqli.use-result.html
Для подготовленного утверждения вы можете установить атрибут как false.
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
Других решений пока нет …