Zend框架1.11 Gdata Spreadsheets insertRow非常慢

时间:2013-01-25 17:50:51

标签: zend-framework google-docs

我正在使用insertRow填充一个空的电子表格,它开始大约需要1秒钟才能插入一行,然后在150行左右后减慢到大约5秒钟。

有没有人经历过这种行为? 电子表格中的数据没有任何计算可能会随着更多数据而变得越来越长。

谢谢!

1 个答案:

答案 0 :(得分:2)

我会尽力严格。

如果你看一下类“Zend_Gdata_Spreadsheets”,你会发现方法insertRow()是以非常不理想的方式编写的。参见:

public function insertRow($rowData, $key, $wkshtId = 'default')
{
    $newEntry = new Zend_Gdata_Spreadsheets_ListEntry();
    $newCustomArr = array();
    foreach ($rowData as $k => $v) {
        $newCustom = new Zend_Gdata_Spreadsheets_Extension_Custom();
        $newCustom->setText($v)->setColumnName($k);
        $newEntry->addCustom($newCustom);
    }

    $query = new Zend_Gdata_Spreadsheets_ListQuery();
    $query->setSpreadsheetKey($key);
    $query->setWorksheetId($wkshtId);

    $feed = $this->getListFeed($query);
    $editLink = $feed->getLink('http://schemas.google.com/g/2005#post');

    return $this->insertEntry($newEntry->saveXML(), $editLink->href, 'Zend_Gdata_Spreadsheets_ListEntry');
}

简而言之,它会加载整个电子表格,以便了解此值$ editLink-> href,以便在电子表格中发布新行。

治愈是为了避免使用这种方法insertRow。 相反,在代码中获取$ editLink-> href一次,然后通过再现此方法的其余行为每次插入新行。即,在您的代码而不是$ service-> insertRow()中使用以下内容:

//get your $editLink once:
$query = new Zend_Gdata_Spreadsheets_ListQuery();
$query->setSpreadsheetKey($key);
$query->setWorksheetId($wkshtId);
$query->setMaxResults(1);

$feed = $service->getListFeed($query);
$editLink = $feed->getLink('http://schemas.google.com/g/2005#post');
....
//instead of $service->insertRow:
$newEntry = new Zend_Gdata_Spreadsheets_ListEntry();
$newCustomArr = array();
foreach ($rowData as $k => $v) {
    $newCustom = new Zend_Gdata_Spreadsheets_Extension_Custom();
    $newCustom->setText($v)->setColumnName($k);
    $newEntry->addCustom($newCustom);
}
$service->insertEntry($newEntry->saveXML(), $editLink->href, 'Zend_Gdata_Spreadsheets_ListEntry');

不要忘记鼓励这个伟大的答案,花了我几天才弄明白。我认为ZF很棒,但有时候你不想在资源优化方面过多依赖他们的coode。