PHP PDO 如何在内部工作?

Posted

技术标签:

【中文标题】PHP PDO 如何在内部工作?【英文标题】:How does PHP PDO work internally? 【发布时间】:2011-02-01 09:22:24 【问题描述】:

我想在我的应用程序中使用 pdo,但在此之前我想了解内部如何 PDOStatement->fetchPDOStatement->fetchAll

对于我的应用程序,我想做一些类似“SELECT * FROM myTable”的操作并插入到 csv 文件中,它有大约 90000 行数据。

我的问题是,如果我在这里使用PDOStatement->fetch

// First, prepare the statement, using placeholders
$query = "SELECT * FROM tableName";
$stmt = $this->connection->prepare($query);

// Execute the statement
$stmt->execute();
var_dump($stmt->fetch(PDO::FETCH_ASSOC));

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) 

echo "Hi";
// Export every row to a file
fputcsv($data, $row);

每次从数据库中提取后,该提取的结果是否会存储在内存中?

意思是当我进行第二次提取时,内存中会包含第一次提取的数据以及第二次提取的数据。

因此,如果我有 90000 行数据,并且每次都进行 fetch 操作,那么内存将被更新以获取新的 fetch 结果,而不会从先前的 fetch 中删除结果,因此最后一次 fetch 内存将已经有 89999 行数据。

    这是怎么回事PDOStatement::fetch 有效吗? 性能方面,此堆栈如何 对抗PDOStatement::fetchAll

更新:关于 fetch 和 fetchAll 从内存使用的角度来看

只是想在这个问题中添加一些东西,因为最近发现了一些关于 fetch 和 fetchAll 的内容,希望这将使这个问题值得人们将来访问这个问题,以了解 fetch 和 fetchAll 参数。

fetch 不在内存中存储信息,它在逐行的基础上工作,所以它会遍历结果集并返回第 1 行,而不是再次进入结果集并再次返回第 2 行,请注意这里不会返回第 1 行和第 2 行,但只会返回第 2 行,因此 fetch 不会将任何内容存储到内存中,但 fetchAll 会将详细信息存储到内存中。因此,如果我们要处理大小约为 100K 的结果集,则 fetch 与 fetchAll 相比是更好的选择。

【问题讨论】:

这个问题清楚还是需要更多信息? 【参考方案1】:

php 通常将其结果保存在服务器上。这一切都取决于司机。 mysql 可以在“无缓冲”模式下使用,但使用起来有点棘手。 fetchAll() 在大型结果集上会导致网络泛滥、内存耗尽等。

在需要处理超过 1,000 行的所有情况下,我都没有使用 PHP。还要考虑您的数据库引擎是否已经具有 CSV 导出操作。很多人都这样做。

【讨论】:

【参考方案2】:

对于大数据,我建议您使用 PDO::FETCH_LAZY 而不是 PDO::FETCH_ASSOC。 我用它逐行导出到csv,它工作正常。 没有任何“内存不足”错误。

【讨论】:

这更像是一个评论而不是我要说的答案。

以上是关于PHP PDO 如何在内部工作?的主要内容,如果未能解决你的问题,请参考以下文章

SignalR 如何在内部工作?

SqlDataAdapter 如何在内部工作?

PHP 的内置函数是如何在内部实现的?

数据库如何在内部工作? [关闭]

新的 FragmentTransaction commitNow() 在内部如何工作?

数据库提交如何在内部工作