1

我有一个 sql 视图,它返回超过 10,000 条记录,大约 120 列(荒谬,我知道)。

视图数据是使用 Zend_Db_Table_Abstract 对象从 PHP 中的数据库收集的。我们有一个报表控制器,它执行 fetchAll(这显然会创建一个庞大的数组)并将该数组存储在一个视图对象中。接下来我们有一个视图脚本,它遍历数组并回显一个 json 格式的数组。

这很慢www。渲染此报告需要超过 1 分钟,我该怎么做才能加快速度?

请记住,我对这个项目非常陌生,对 Zend 和 PHP 知之甚少。此外,由于数据保护等原因,我不能放弃太多。

如果您可以询问您需要什么来帮助您收集图片,那就太好了。但基本上这就是脚本的作用:

报告控制器:

Setup some basic json report data (for data tables)
$this->view->report_data = fetchALL($oSelect);

查看脚本:

Output the basic json stuff, then:
"report_data": [
<?php 
    for($i = 0; $i < count($this->report_data); $i++){
        echo "[";
        foreach($this->columns as $k=>$col){
            echo '"'. $this->escape($this->report_data[$i][$col]) .'"';
            if($k < count($this->columns) -1 ){
                echo ',';
            }
        }
        echo "]";
        if($i < count($this->report_data) -1){
            echo ",";
        }
        echo"\n";
    }
?> ]

因此,在做了一些研究之后,我收集到我可以使用 fetch() 而不是 fetchAll() 以便一次获取 1 行,以避免庞大的数组。但是我尝试使用 fetch() 并收到此错误:

调用未定义的方法Zend_Db_Table_Abstract::fetch()

所以现在我很沮丧。

我的想法是获取每一行并输出 Json 格式的每一行,但是我真的不知道如何在报表控制器/视图场景中执行此操作。我是否必须摆脱视图脚本而只使用控制器来输出数据?

无论如何为什么不起作用fetch(),我实际上也无法在文档中看到它,好吧有一些数组function _fetch()

任何帮助将不胜感激,如果您需要更多信息,请询问。谢谢

4

3 回答 3

0

请参阅fetch()的文档。

以下不是很优雅,但可以帮助您:

模型:

...
function getResults()
{
    return $db->query('SELECT * FROM bugs');
}
...

控制器:

...
$this->view->report_data = $model->getResults();
...

看法:

...
while ($row = $stmt->fetch(PDO::FETCH_OBJ)) {
    echo Zend_Json::encode($row);
}
...

我没有测试过代码,但你应该明白了。

于 2012-05-29T09:43:55.850 回答
0

您必须在此处即兴使用框架以获得额外的性能

在控制器中

$this->view->result = mysql_query($sql);

在视图中

while ($row = mysql_fetch_assoc($this->result)) {
 echo json_encode($row);
}

注意设置mysql程序界面阅读 http://php.net/manual/en/function.mysql-fetch-assoc.php

于 2012-05-29T10:09:39.090 回答
0

正如您从错误消息中意识到的Zend_Db_Table_Abstract那样,没有fetch()方法。但是,它确实有一个fetchRow()具有此签名的方法:-

/**
 * Fetches one row in an object of type Zend_Db_Table_Row_Abstract,
 * or returns null if no row matches the specified criteria.
 *
 * @param string|array|Zend_Db_Table_Select $where  OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object.
 * @param string|array                      $order  OPTIONAL An SQL ORDER clause.
 * @param int                               $offset OPTIONAL An SQL OFFSET value.
 * @return Zend_Db_Table_Row_Abstract|null The row results per the
 *     Zend_Db_Adapter fetch mode, or null if no row found.
 */
public function fetchRow($where = null, $order = null, $offset = null)

所以用 fetchRow() 替换 fetch() 并循环 while!null === fetchRow()应该适合你。

深入研究 Zend Framework 的代码以查看提供的内容总是值得的。

Zend Paginator也可能是您的一个选项,因为它只获取呈现页面所需的记录。

于 2012-05-29T10:26:20.447 回答