【问题标题】:PHP yield vs PDO fetch?PHP 产量与 PDO 获取?
【发布时间】:2023-03-17 07:41:01
【问题描述】:

昨天,我了解到 PHP 有一个yield() 方法。我不确定它在 PHP 中的用处。

一位同事说,它可以帮助 SQL 语句返回许多导致潜在内存问题的行。我相信他指的是fetchAll()。 但是,除了使用fetchAll(),还可以使用fetch() 并逐行处理。所以,yield() 并不是解决他所指问题的关键。

我在这里错过了 yield()fetch() 的一些内容吗?使用yield() 和生成器还有更多好处吗?

P.S.:确实,在大型应用程序中使用yield() 比使用fetch() 更容易编写干净、可读和可维护的代码。

【问题讨论】:

  • 好吧,PDO 并不是一个很好的 yield usefilness 示例,因为 PDO 语句已经实现了一个可遍历的接口,并且可以使用 foreach 进行迭代。但是使用 mysqli,您可以使用 yield 使 mysqli 结果与 foreach 一起迭代。
  • 嗯,总的来说,这归结为 generators 的用途(因为 yield 是 generators 的实现细节)。生成器可用于创建行为类似于数组(或者更确切地说是iterable)的东西,但不会将其所有数据存储在内存中,而是根据需要在每次迭代时生成 .是的,这可以在获取数据库结果的上下文中使用,但也可以用于实现无限计数器或任何数量的其他东西。

标签: php mysqli pdo fetch yield


【解决方案1】:

因此,yield() 并不是解决他所指问题的关键。

没错。

但如果您愿意,它可以让您将while()/fetch() 序列伪装成foreach() 调用,同时也没有内存开销。

然而,PDO 并不是一个很好的例子,因为PDOStatement 已经实现了一个可遍历的接口,因此can be iterated over using foreach()

$stmt = $pdo->query('SELECT name FROM users');
foreach ($stmt as $row)
{
    var_export($row);
}

因此,让我们以 mysqli 作为示例 API,它只能逐个流式传输结果。
编辑。实际上,since 5.4.0 mysqli supports Traversable 也是如此,因此将 yield 与 mysqli_result 一起使用也没有任何意义。但是,嗯,让我们保留它以用于演示目的。

让我们创建一个这样的生成器

function mysqli_gen (mysqli_result $res)
{
    while($row = mysqli_fetch_assoc($res))
    {
        yield $row;
    }
}

现在您可以使用 foreach 获取行而无需开销:

$res = $mysqli->query("SELECT * FROM users");
foreach (mysqli_gen($res) as $row)
{
    var_export($row);
}

【讨论】:

    猜你喜欢
    • 2016-09-22
    • 2011-07-05
    • 2014-10-28
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多