【问题标题】:Zend framework 1.11 Gdata Spreadsheets insertRow very slowZend framework 1.11 Gdata Spreadsheets insertRow 很慢
【发布时间】:2013-10-30 08:57:32
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: zend-framework google-docs


    【解决方案1】:

    我会尽量严格。

    如果您查看“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 很棒,但有时在资源优化方面您不想过多依赖他们的代码。

    【讨论】:

    • 感谢您的回答!我在$query->setWorksheetId($wkshtId); 正下方添加了$query->setMaxResults(1);,并将静态函数变量添加到缓存$editLink,因此它只被检索一次。
    • @Ralphz 酷,我更新了答案,谢谢。不错的收获,对于那些必须处理大张床单的人来说非常有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多