Не знаю, имеет ли кто-нибудь опыт работы с API Google Spreadsheets или классами Zend_GData, но это стоит того:
Когда я пытаюсь вставить значение в таблицу 750 строк, это занимает много времени, а затем выдает ошибку, которая превысила мой предел памяти (который составляет 128 МБ!). Я также получил это при запросе всех записей этой таблицы, но это я могу сделать, потому что это довольно много данных. Но почему это происходит при вставке строки? Это не слишком сложно, не так ли? Вот код, который я использовал:
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; } }
Я просто столкнулся с этим сегодня. При вызове метода insertRow()
мой скрипт использовал более 130 МБ памяти, вставляя в рабочий лист размером ~ 600 записей. Я тестировал это в версии 1.11 .
В процессе работы я использую существующий объект клиента Zend HTTP для отправки POST с записью Atom, содержащей данные для строки, которая будет вставлена. Я выполнил протокол Google для добавления строки списка .
Ниже приведен код, который я придумал. Параметр $values
является ассоциативным массивом, который имеет ключи, соответствующие именам столбцов для строки. Конечно, вы уже знаете свою $spreadsheetKey
и $worksheetId
(если рабочий лист, в который вы вставляете, является первым листом в электронной таблице, я не уверен, что его идентификатор необходим).
$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; }
Надеюсь это поможет.
Извините, но я не могу комментировать пост Джонатана Фриланда, поэтому я размещаю его так.
Я добавил это внутри insertRow (), чтобы заставить его работать.
$token = $httpClient->getClientLoginToken(); $httpClient->setHeaders('Authorization','GoogleLogin auth='.$token); $httpClient->setHeaders('Content-Type', 'application/atom+xml');
Это серьезная ошибка Zend_Gdata. Он загружает всю электронную таблицу (делая пустой запрос) и загружает ее в память только для создания URL-адреса запроса для вставки. Я сообщил об этой проблеме, а также об исправлении, но проблема была проигнорирована разработчиками Zend и никогда не может быть исправлена.