PHP 产量与 PDO 获取?
PHP yield vs PDO fetch?
昨天,我了解到 PHP 有一个 yield()
方法。我不确定它在 PHP.
中的用处
一位同事说,它可以帮助 SQL 语句返回许多行,从而导致潜在的内存问题。我相信他指的是 fetchAll()
。
但是,除了使用 fetchAll()
,还可以使用 fetch()
并逐行处理。所以,yield()
并不是解决他所指问题的关键。
我是不是漏掉了一些关于 yield()
和 fetch()
的东西?使用 yield()
和生成器是否有更多好处?
P.S.: 的确,在大型应用程序中使用 yield()
比使用 [=14 更容易编写干净、可读和可维护的代码=].
So, yield() is not key to solving the issue he is referring to.
完全正确。
但如果您愿意,它可以让您将 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);
}
昨天,我了解到 PHP 有一个 yield()
方法。我不确定它在 PHP.
一位同事说,它可以帮助 SQL 语句返回许多行,从而导致潜在的内存问题。我相信他指的是 fetchAll()
。
但是,除了使用 fetchAll()
,还可以使用 fetch()
并逐行处理。所以,yield()
并不是解决他所指问题的关键。
我是不是漏掉了一些关于 yield()
和 fetch()
的东西?使用 yield()
和生成器是否有更多好处?
P.S.: 的确,在大型应用程序中使用 yield()
比使用 [=14 更容易编写干净、可读和可维护的代码=].
So, yield() is not key to solving the issue he is referring to.
完全正确。
但如果您愿意,它可以让您将 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);
}