3

不知道是否有人对 Google 电子表格 API 或 Zend_GData 类有经验,但值得一试:

当我尝试在 750 行的电子表格中插入一个值时,它需要很长时间,然后抛出一个错误,即超出了我的内存限制(即 128 MB!)。我在查询这个电子表格的所有记录时也得到了这个,但我可以成像,因为它有很多数据。但是为什么插入行时会发生这种情况?这不是太复杂,是吗?这是我使用的代码:

public function insertIntoSpreadsheet($username, $password, $spreadSheetId, $data = array()) {
    $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
    $client = Zend_Gdata_ClientLogin::getHttpClient($username, $password, $service);
    $client->setConfig(array( 'timeout' => 240 ));
    $service = new Zend_Gdata_Spreadsheets($client);
    if (count($data) == 0) {
        die("No valid data");
    }
    try {
        $newEntry = $service->insertRow($data, $spreadSheetId);
        return true;
    } catch (Exception $e) {
        return false;
    }
}
4

3 回答 3

4

我今天刚碰到这个。调用该insertRow()方法时,我的脚本使用了超过 130MB 的内存插入到约 600 条记录的工作表中。我在框架版本 1.11上对此进行了测试。

作为一种变通方法,我使用现有的 Zend HTTP 客户端对象发送一个带有 Atom 条目的 POST,其中包含要插入的行的数据。我遵循 Google 的添加列表行的协议。

下面是我想出的代码。该$values参数是一个关联数组,其键与行的列名匹配。当然,您已经知道您的$spreadsheetKeyand $worksheetId(如果您要插入的工作表是电子表格中的第一个工作表,我不确定它的 ID 是否必要)。

$authService = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$httpClient = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $authService);

function insertRow($httpClient, $spreadsheetKey, $worksheetId, $values) {
    $entry = createEntry($values);
    $httpClient->setUri("https://spreadsheets.google.com/feeds/list/".$spreadsheetKey."/".$worksheetId."/private/full");
    $response = $httpClient->setRawData($entry, 'application/atom+xml')->request('POST');
    return $response->getStatus() == 201;
}

function createEntry($values) { 
    $entry = "<entry xmlns=\"http://www.w3.org/2005/Atom\"";
    $entry .= " xmlns:gsx=\"http://schemas.google.com/spreadsheets/2006/extended\">";
    foreach($values as $key => $value) {
        $entry .= "<gsx:".$key.">".$value."</gsx:".$key.">";
    }
    $entry .= "</entry>";
    return $entry;
}

希望这可以帮助。

于 2010-11-03T20:03:18.267 回答
1

抱歉,我无法评论 Jonathan Freeland 的帖子,所以我这样发布。

我在 insertRow() 中添加了它以使其工作。

$token = $httpClient->getClientLoginToken();
$httpClient->setHeaders('Authorization','GoogleLogin auth='.$token);
$httpClient->setHeaders('Content-Type', 'application/atom+xml');
于 2010-12-09T09:39:28.563 回答
0

这是一个严重的 Zend_Gdata 错误。它正在下载整个电子表格(通过执行空查询)并将其加载到内存中,只是为了构建插入的请求 url。我报告了这个问题以及一个修复,但是 Zend 维护者忽略了这个问题,并且可能永远不会得到修复。

于 2011-03-29T15:53:52.470 回答