2

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);
4

1 回答 1

0

Mysql Documentation上有一个例子,所以你不要作为参数,只是运行一个方法。

<?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);
于 2018-09-26T15:08:22.093 回答