PHP产量与PDO获取?

时间:2016-06-15 07:32:14

标签: php mysqli pdo fetch yield

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

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

我在这里遗漏了yield() vs fetch()的内容吗?使用yield()和生成器有什么好处吗?

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

1 个答案:

答案 0 :(得分:10)

  

因此,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);
}