我有一个sql视图,它返回超过10,000条记录,大约有120列(荒谬,我知道)。
使用Zend_Db_Table_Abstract对象从PHP中的数据库收集视图数据。我们有一个报告控制器,它执行fetchAll(显然创建一个大型数组)并将数组存储在视图对象中。接下来我们有一个视图脚本,它遍历数组并回显一个json格式的数组。
这很慢。比如超过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()
如果您需要更多信息,我们将不胜感激。 感谢
答案 0 :(得分: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);
}
...
我没有测试过代码,但你应该明白这个想法。
答案 1 :(得分: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
答案 2 :(得分: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()并在!null === fetchRow()
时循环应该适合你。
总是值得深入研究Zend Framework的代码,看看提供什么。
Zend Paginator也可能是您的选项,因为它只是获取呈现页面所需的记录。