Внедрение полной синхронизации с gmail api

Я использую php-библиотеку Google, которая работает с gmail api. Я хочу получать все сообщения из моей учетной записи gmail.

Вот как я это делаю:

        do {
            $this->client->setUseBatch(false);
            $messagesResponse = $service->users_messages->listUsersMessages('me', compact('pageToken'));

            if ($messagesResponse->getMessages()) {
                $batch = new Google_Http_Batch($this->client);
                $this->client->setUseBatch(true);

                foreach ($messagesResponse as $item) {
                    $request = $service->users_messages->get('me', $item->id, ['format' => 'raw']);
                    $batch->add($request);
                }

                $messages = array_merge($messages, $batch->execute());
                $pageToken = $messagesResponse->getNextPageToken();
            }
        } while ($pageToken);

Когда я запускаю этот скрипт из CLI, я получаю следующую ошибку:

[Google_IO_Exception]
Время ожидания операции истекло через 100 000 миллисекунд при получении 57157107 байтов.

Если я прокомментирую строку с получением нового токена, я получу первые 100 сообщений, и это сработает. Но я не могу собрать их всех. У PHP нет таймаута, это google_io_exception, поэтому я не знаю, как решить проблему. Плюс любые советы по оптимизации были бы замечательны, так как единственное, что я знаю, это пакетные запросы, но я их использую.


person Victor    schedule 04.06.2015    source источник
comment
Может быть какое-то ограничение API? Если вы можете успешно получить первые 100, есть ли способ передать смещение, чтобы вы могли прокручивать свой почтовый ящик и получать сообщения по сотне за раз? Должен признаться, у меня нет никакого опыта работы с API GMail, так что это только мои догадки...   -  person rstat1    schedule 04.06.2015
comment
Я бы предложил попробовать с меньшим размером партии, чем 100. Попробуйте, может быть, 20 или 50 и посмотрите, будет ли это работать быстрее. (вы можете сделать это, просто добавив maxResults в свой вызов listUsersMessages и не меняя больше ничего в своем коде.)   -  person Eric D    schedule 04.06.2015
comment
Как ни странно, теперь я получил (429) ограничение на количество пользователей. Я пошел в свою консоль разработчика и проверил, я получил 100% от общего количества оставшихся запросов. Не знаю в чем проблема, попробую разобраться   -  person Victor    schedule 04.06.2015
comment
Эрик, я получил ту же ошибку, когда установил maxResults = 20. Сценарий работает несколько минут, а затем сообщает, что время ожидания операции истекло через 100000 миллисекунд с полученным 53707801 байтом. Какие-либо предложения?   -  person Victor    schedule 05.06.2015


Ответы (1)


Этот вопрос по-прежнему актуален, и, поскольку мне потребовалось много времени, чтобы получить четкий ответ, я поделюсь тем, что нашел:

Вы ограничены 100 вызовами в одном пакетном запросе. Если вам нужно сделать больше звонков, используйте несколько пакетных запросов.

https://developers.google.com/gmail/api/guides/

Как вы можете видеть, на основе документации вы не можете иметь более 100 вызовов в одном пакетном запросе. Поэтому вам придется рассчитывать и выполнять ниже этого предела.

Если вы сохраните этот лимит в 100 запросов, все должно работать нормально.

person maxime_039    schedule 26.03.2017