Too many requests per second
Пытаюсь вытянуть информацию отправителя вложенным запросом, возникает следующая ошибка: 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;
Вариантов несколько:
- Добавить в функцию получения usleep/sleep
- Добавить в функцию получения "умный" usleep/sleep(с отслеживанием количества запросов и времени)
- Добавить в библиотеку функциональность, которая будет насильно давать делать только 3 запроса в секунду
- Получать сразу больше одного пользователя, то есть сделать "кумулятивную" функцию, которая будет вызываться только при накоплении количества пользователей
- Обратить внимание на метод
execute
У каждого метода есть свои плюсы и минусы, но вообще сейчас ни в одной библиотеке нет методов, которые могут помочь справиться с этой напастью.
Могу предложить костыль, file_get_contents работает медленнее чем Guzzle, поэтому можно например тут https://github.com/getjump/VkApiPHP/blob/master/src/getjump/Vk/RequestTransaction.php#L137 вызов Guzzle поменять на вызов file_get_contents с контекстом.
Спасибо за ответ! Тоже думал вариант с execute но не знаю как это сделать, второй запрос зависит от первого, а в примере указаны однотипные запросы . Остается вариант с костылем file_get_contents
С чем связана политика отсутсвия кеширования? https://github.com/getjump/VkApiPHP/blob/master/src/getjump/Vk/RequestTransaction.php#L117