php - Zend_Db : fetchAll() or query()/fetch() for a huge number of records

标签 php zend-framework zend-db

假设我有

$db is an instance of Zend_Db_Adapter_Abstract and
$sql = 'SELECT blah blah FROM table' will return a huge number of records.

有两个代码片段来处理返回的数据,如下所示。

// Code fragment 1 (let's call it C1).
$results = $db->fetchAll($sql);
foreach ($results as $row) {
    // Process $row
}

// Code fragment 2 (let's call it C2).
$stmt = $db->query($sql);
while ($row = $stmt->fetch()) {
    // Process $row
}

我的理解是C1会将所有返回的数据加载到$results中。因此,大量数据被加载到 PHP 内存中。以下是我的问题。

  1. C2 是将所有数据加载到 PHP 内存中,还是像准备/执行一样逐一处理?
  2. 假设没有其他选择,C1 还是 C2 是更好的选择?

谢谢!

最佳答案

您的预感是正确的。至少如果您使用的是 PDO 驱动程序,->fetch() 会读取未缓冲的结果,而 ->fetchAll() 会返回一个大数组中的所有数据。

请注意,如果您正在使用 ->fetch(),则必须注意在循环中尝试执行的操作。当您仍然有一个未缓冲的结果集时,您不能在同一个连接上运行其他查询。

因此,如果您的计划是在循环内更新那些相同的行,则需要找到一种方法来延迟执行更新(通过排队然后以某种方式排队)直到您退出循环。

关于php - Zend_Db : fetchAll() or query()/fetch() for a huge number of records,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10465944/

相关文章:

php - Zend_Pdf 操作 PDF 表单域

zend-framework - Zend : Form validation: value was not found in the haystack error

php - 使用 Zend_Db_Table 访问远程服务器

php - 如何使用 ZF2 获取数组中的结果

zend-framework - Zend 仅执行两个表更新之一

php - 如何根据文件名应用类?

php - Codeigniter 中的分页 ajax,从数据库加载数据 otomatis

php - 将数据从PHP客户端发送到PHP Web服务器套接字

php - 试图抽象数据库类并停止其公共(public)使用 : Laravel 5. 2.31

ajax - 如何将 Zend Framework 表单哈希( token )与 AJAX 结合使用