gpt4 book ai didi

PHP yield 与 PDO 获取?

转载 作者:可可西里 更新时间:2023-11-01 12:50:30 24 4
gpt4 key购买 nike

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

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

我是否遗漏了一些关于 yield()fetch() 的内容?使用 yield() 和生成器是否有更多好处?

附注:的确,在大型应用程序中使用 yield() 比使用 fetch() .

最佳答案

So, yield() is not key to solving the issue he is referring to.

没错。

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

但是,PDO 并不是一个很好的例子,因为 PDOStatement 已经实现了一个可遍历的接口(interface),因此 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);
}

关于PHP yield 与 PDO 获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37828879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com