Intereting Posts
Я не могу сохранить некоторые образы facebook на моем сервере, так как он не понимает файл Как разделять слова, используя php? PDO: Как получить доступ к файлу Microsoft Access в Linux? MySQLi – сервер возвратил неизвестный тип 246 Сохранить кодированное изображение base64 в файл в PHP php: имитировать набор результатов mysql PHP DomDocument не может обрабатывать символы utf-8 (☆) MySQL SELECT получается из 1 таблицы, но исключает результаты в зависимости от другой таблицы? Как заменить переменную в строке с помощью PHP? Получить данные из json и org.json.JSONException PHP, как я могу проверить, является ли файл mp3 или файлом изображения? Что-то не так в запросе UPDATE PHP удаляет ссылки на определенный сайт, но сохраняет текст Laravel – Создание токенов API для внутреннего использования для каждого пользователя разбиение на страницы с использованием кодировки с выбранными записями

API Google Spreadsheet: превышена память

Не знаю, имеет ли кто-нибудь опыт работы с 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 и никогда не может быть исправлена.