Php 大表上的Zend Fetch 10000多行,约100列

Php 大表上的Zend Fetch 10000多行,约100列,php,zend-framework,zend-db-table,Php,Zend Framework,Zend Db Table,我有一个sql视图,它返回10000多条记录,大约120列,我知道 视图数据是使用Zend_Db_Table_抽象对象从PHP中的数据库收集的。我们有一个报表控制器,它执行fetchAll,这显然创建了一个大型数组,并将数组存储在视图对象中。接下来,我们有一个视图脚本,它在数组上迭代并回显json格式的数组 这太慢了。如超过1分钟来呈现此报告,我可以做些什么来加快此速度 请记住,我对这个项目非常陌生,对Zend一无所知,对PHP也知之甚少。此外,由于数据保护等原因,我不能透露太多 如果你能问你需

我有一个sql视图,它返回10000多条记录,大约120列,我知道

视图数据是使用Zend_Db_Table_抽象对象从PHP中的数据库收集的。我们有一个报表控制器,它执行fetchAll,这显然创建了一个大型数组,并将数组存储在视图对象中。接下来,我们有一个视图脚本,它在数组上迭代并回显json格式的数组

这太慢了。如超过1分钟来呈现此报告,我可以做些什么来加快此速度

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

如果你能问你需要什么来帮助你收集图片,那就太好了。但基本上脚本就是这样做的:

报表管理员:

Setup some basic json report data (for data tables)
$this->view->report_data = fetchALL($oSelect);
...
$this->view->report_data = $model->getResults();
...
查看脚本:

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,以便一次获取一行,以避免大量数组。但是,我尝试使用fetch并出现以下错误:

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

所以现在我很沮丧

我的想法是获得每一行并输出每一行Json格式,但是我真的不知道在报表控制器/视图场景中如何做到这一点。我是否必须摆脱视图脚本,只使用控制器输出数据

无论如何,为什么fetch不起作用,我也不能在文档中看到它,因为有一些数组函数\u fetch

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

有关详细信息,请参阅文档

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

型号:

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

Setup some basic json report data (for data tables)
$this->view->report_data = fetchALL($oSelect);
...
$this->view->report_data = $model->getResults();
...
视图:


我还没有测试代码,但您应该明白了。

您必须在这里即兴使用框架来获得额外的性能

内部控制器

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

while ($row = mysql_fetch_assoc($this->result)) {
 echo json_encode($row);
}
设置mysql过程接口的注意事项

正如您从错误消息Zend\u Db\u Table\u Abstract中所意识到的,它没有获取方法。但是,它确实有一个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并在运行时循环!null===fetchRow应该适合您

深入研究Zend框架的代码总是值得的,以了解它提供了什么


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

在您看来,是否在一个页面上显示所有这10000条记录?我不熟悉Zend,但通常当单个请求太多时,可以使用分页。因此,您不是一次获取并显示所有数据,而是以适当大小的片段显示。也许Zend Paginator能帮上忙?首先要确保php是瓶装水。通过phpmyadmin或mysql控制台运行您的查询,看看它是否在那里运行得很快。通过psql命令行加载视图大约需要2秒钟@hade视图以json格式输出全部记录。然后使用datatables来处理并显示/分页。如果可以的话,为什么要编写自己的编码函数:foreach$this->report_data as$d echo json_encode$d;。如果需要键“report_data”,只需将sql结果添加到具有key@Ashley我没有写那个encode函数,是的,你是对的,这就是我想要做的,但是使用json_encode函数似乎不能替换null。使用我发布的encode函数,它返回空字符串而不是空字符串。我不知道是怎么回事,但似乎NULLS正在破坏datatables javascript。Thnaks为此,我在控制器中得到如下结果:$this->view->report_data=$view->fetchAll$oSelect;您提到要在视图脚本中进行提取,但是我无法访问视图脚本中的$view对象:/I似乎无法使其正常工作,它似乎每次都返回第一行:而$this->view->report_data=$view->fetchRow$oSelect{echo Zend_Json::encode$row;}我正在使用postgress,所以我不知道这对我有什么作用。