【问题标题】:What are the memory implications of passing a MySQLi result to a function in PHP?将 MySQLi 结果传递给 PHP 中的函数对内存有什么影响?
【发布时间】:2012-03-31 01:01:25
【问题描述】:

Stackoverflow 的各位大神

假设我有一个选择大型数据集的 MySQL 查询:

$query = "SELECT col_1, col_2, ..., col_99 FROM big_table";

我得到如下 MySQLi 结果:

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

然后我没有在这个范围内处理 $result,而是将它传递给一个函数:

my_function($result);

一旦进入 my_function(),我会遍历结果中的每一行并做一些事情:

function my_function($result) {

    while($row = $result->fetch_object()) {
        ...
    }

}

请帮助我理解这种方法的记忆含义。

换句话说,$result 包含什么,将它传递给函数有什么陷阱吗?我应该考虑通过引用传递 $result 吗?对于它的价值,一旦 my_function() 完成它,我将不再需要 $result。

来自南非的干杯!

【问题讨论】:

  • $result 将是 false/true 或对象,您不需要通过引用传递它
  • $result 是这里的资源。 不是对象。

标签: php optimization mysqli


【解决方案1】:

你根本不会有任何记忆影响。 $result 持有 resource。它不包含整个结果。它只是结果的资源 ID。 MySQL 使用它来收集结果。

【讨论】:

    【解决方案2】:

    这种方法几乎不会影响内存。 PHP 通过引用传递对象,因此在将对象传递给函数时使用的内存非常少。

    数组并非如此,它们使用一种称为 Copy On Write 的技术,这意味着如果您在函数内更改数组,则该数组将被克隆。

    您总是可以see for yourself 影响是什么。

    【讨论】:

      【解决方案3】:

      PHP 5+ 中的对象自动通过引用传递,因此将结果对象传递给函数不会复制它。

      然后您可以在调用函数后取消设置变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多