【问题标题】:Use of mysql_unbuffered_query in Zend Frame Work, is it supported?Zend Framework 中使用 mysql 无缓冲查询,是否支持?
【发布时间】:2009-02-19 18:35:07
【问题描述】:

我需要运行一个将检索大量记录的查询。
这意味着我不能使用 mysqli 的 ZF 包装器,它在底层使用 mysqli-store-result。 那么,ZF 中是否有使用 mysqli mysqli-use-result link text 的包装器,它将返回一个迭代器/记录集/资源,而不是所有结果都已加载到内存中的数组,或者我需要自己实施?

【问题讨论】:

  • 为什么不能使用 ZF 包装器?
  • 我不能在返回之前将整个集合读入内存。这将导致进程由于内存不足而崩溃(我在这里说的是数百万条记录)。我将使用从 mysqli 包装器扩展而来的 ZF 包装器

标签: php mysql zend-framework


【解决方案1】:

首先,没有 Zend Framework 数据库适配器使用ext/mysql。有ext/mysqliext/pdo_mysql 的适配器。

在 MySQLi 适配器中,它总是调用mysqli_store_result()(参见 Zend/Db/Statement/Mysqli.php,靠近第 250 行),这意味着它只支持 缓冲 查询结果。 Zend 框架目前不支持任何更改此选项的选项,因此您可以尝试自己编辑该行代码以使用mysqli_use_result()

编辑:在 PDO_MySQL 适配器中,默认使用缓冲查询。

PHP 5.4.6 源代码,文件 ext/pdo_mysql/mysql_driver.c,第 590 行,在函数 pdo_mysql_handle_factory() 中:

H->buffered = H->emulate_prepare = 1;

请注意,无论使用无缓冲查询,如果您在数据库包装类上调用fetchAll(),您将获取庞大结果集的所有行,并且可能会超过 PHP 的内存限制。因此,您必须开始一个查询并编写一个循环来一次获取一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    相关资源
    最近更新 更多