不知道是否有人有使用Google Spreadsheets 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;
}
}
答案 0 :(得分:4)
我今天刚遇到这个。调用insertRow()
方法时,我的脚本使用了大约130MB的内存插入到大约600条记录的工作表中。我在framework version 1.11上测试了这个。
作为解决方法,我使用现有的Zend HTTP客户端对象发送一个POST,其中包含要插入的行的数据的Atom条目。我遵循了Google的adding a list row协议。
以下是我提出的代码。 $values
参数是一个关联数组,其键具有与行的列名匹配的键。当然,您已经知道了$spreadsheetKey
和$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;
}
希望这有帮助。
答案 1 :(得分:1)
很抱歉,我无法对Jonathan Freeland的帖子发表评论,所以我就这样发帖了。
我在insertRow()中添加了这个以使其工作。
$token = $httpClient->getClientLoginToken();
$httpClient->setHeaders('Authorization','GoogleLogin auth='.$token);
$httpClient->setHeaders('Content-Type', 'application/atom+xml');
答案 2 :(得分:0)
这是一个严重的Zend_Gdata错误。它正在下载整个电子表格(通过执行空查询)并将其加载到内存中,以便为插入构建请求URL。我reported the issue以及修复但Zend维护者忽略了这个问题,可能永远不会修复。