Google Spreadsheet API: объем памяти превышен - PullRequest
3 голосов
/ 09 июня 2010

Не знаю, есть ли у кого-то опыт работы с API электронных таблиц Google или классами 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;
    }
}

Ответы [ 3 ]

4 голосов
/ 03 ноября 2010

Я только что столкнулся с этим сегодня.При вызове метода insertRow() мой скрипт использовал более 130 МБ памяти, вставляя в лист ~ 600 записей.Я протестировал это на Framework версии 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;
}

Надеюсь, это поможет.

1 голос
/ 09 декабря 2010

Извините, но я не могу комментировать сообщение Джонатана Фриленда, поэтому я публикую его так.

Я добавил это внутри insertRow (), чтобы заставить его работать.

$token = $httpClient->getClientLoginToken();
$httpClient->setHeaders('Authorization','GoogleLogin auth='.$token);
$httpClient->setHeaders('Content-Type', 'application/atom+xml');
0 голосов
/ 29 марта 2011

Это серьезная ошибка Zend_Gdata.Он загружает всю электронную таблицу (выполняя пустой запрос) и загружает ее в память только для создания URL-адреса запроса на вставку.Я сообщил о проблеме , а также об исправлении, но эта проблема была проигнорирована сопровождающими Zend и, возможно, никогда не будет исправлена.

...