- Есть некий бот, который принимает сообщение (запрос) от юзера.
- Добавляет информацию о том, что поступил запрос и ставит блокировку на последующие запросы (с помощью memcached)
- Выполняет 10 GET запросов к API гугла, и т. к. это гугл и способ не совсем честный, поэтому стоит ограничение между запросами к API с помощью
sleep(1)
- Работает с БД (тут кстати тоже хранится информация о блокировке и при запросе проверяется по кешу + бд)
В итоге, между отправкой сообщения юзером и ответом бота, проходит
~10 секунд.
По идеи, т. к. стоит блокировка на последующие запросы, логично, что следующий ответ на запрос который получит юзер, это будет:
"Извините, дождитесь пожалуйста завершения предыдущей операции".
НО! Если бот отдыхает (активно не принимает запросы) и тут ему резко подкинуть запрос и следом ещё штук 10, то он берет первый запрос в работу, а на следующий не реагирует. И как только завершится первый запрос он берет в работу ВТОРОЙ и уже на СЛЕДУЮЩИЕ 8 он говорит "Извините, подождите".
Если так же продолжить отправлять, он отрабатывает как задумывалось, но стоит дать ему отдохнуть, та же история.
Я не понимаю почему так происходит, это особенность Хостинга/PHP и тут ничего не поделать?
Немного кастрированный код
<?php
if ($bot->isMessage() && !$bot->isCommand()) {
if ($bot->state_name == 'process') {
$bot->reply('Please, wait until the previous search is complete.');
die;
} else {
$bot->setState('process');
}
$GLOBAL_STATUS = $bot->cache->get('GLOBAL_STATUS');
if ($GLOBAL_STATUS == 'process') {
$bot->clearState();
$bot->reply('Queue busy, please try again later.');
die;
} else {
$bot->cache->add('GLOBAL_STATUS', 'process', 60);
}
$bot->hear(['{default}'], function() use($bot) {
$bot->reply(' Search, it takes ~10 seconds...');
$q = $bot->message;
// здесь как раз 10 итераций интервалом в sleep(1)
$data = search($q, 100, $bot->user->data['sort']);
$bot->say('OK, search completed.');
});
}