Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Too many requests per second #11

Open
k-zakhariy opened this issue Jul 7, 2015 · 3 comments
Open

Too many requests per second #11

k-zakhariy opened this issue Jul 7, 2015 · 3 comments

Comments

@k-zakhariy
Copy link

Пытаюсь вытянуть информацию отправителя вложенным запросом, возникает следующая ошибка:
Fatal error: Uncaught exception 'getjump\Vk\Exception\Error' with message 'Too many requests per second' in /var/www/......../vendor/getjump/vk/src/getjump/Vk/Response/Error.php:31 Stack trace: #0

Скажите как обойти лимит запросов?

$vk = $container['services.vk'];
$messages = [];
$queryParams =  ['offset'=>($offsets['vk_messages'] ?: 0),'count'=>25, 'preview_length'=>600];
$query = $vk->request('messages.getDialogs',$queryParams);
$me = $vk->request('users.get', ['fields'=>'photo_50'])->response->get();

$userMap = [];
$userCache = [];
$user = new \getjump\Vk\Wrapper\User($vk);

$fetchData = function($id) use($user, &$userMap, &$userCache){
    if(!isset($userMap[$id]))
    {
      $userMap[$id] = sizeof($userCache);
      $userCache[] = $user->get($id,['photo_50'])->response->get();
    }
    return $userCache[$userMap[$id]];
};
$query->each(function($key, $value) use($fetchData, &$messages, &$me) {
    $user = $fetchData($value->message->user_id);
    // dump($value);

    $value->message->my_id = $me->id;
    $value->message->user_id_photo = $user->photo_50;
    $value->message->me_photo = $me->photo_50;
    $value->message->first_name = $user->first_name;
    $value->message->last_name = $user->last_name;
    $messages[] = $value->message;

  return;
}); 

dd($messages);
$vk_messages_array = $messages;
@getjump
Copy link
Owner

getjump commented Jul 7, 2015

Вариантов несколько:

  1. Добавить в функцию получения usleep/sleep
  2. Добавить в функцию получения "умный" usleep/sleep(с отслеживанием количества запросов и времени)
  3. Добавить в библиотеку функциональность, которая будет насильно давать делать только 3 запроса в секунду
  4. Получать сразу больше одного пользователя, то есть сделать "кумулятивную" функцию, которая будет вызываться только при накоплении количества пользователей
  5. Обратить внимание на метод execute

У каждого метода есть свои плюсы и минусы, но вообще сейчас ни в одной библиотеке нет методов, которые могут помочь справиться с этой напастью.

Могу предложить костыль, file_get_contents работает медленнее чем Guzzle, поэтому можно например тут https://github.com/getjump/VkApiPHP/blob/master/src/getjump/Vk/RequestTransaction.php#L137 вызов Guzzle поменять на вызов file_get_contents с контекстом.

@k-zakhariy
Copy link
Author

Спасибо за ответ! Тоже думал вариант с execute но не знаю как это сделать, второй запрос зависит от первого, а в примере указаны однотипные запросы . Остается вариант с костылем file_get_contents

@Enelar
Copy link

Enelar commented Aug 3, 2016

С чем связана политика отсутсвия кеширования?
https://github.com/getjump/VkApiPHP/blob/master/src/getjump/Vk/RequestTransaction.php#L117

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants