@hesy

PHP засыпает между запросами, как его разбудить?

  • Есть некий бот, который принимает сообщение (запрос) от юзера.
  • Добавляет информацию о том, что поступил запрос и ставит блокировку на последующие запросы (с помощью 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.');
    });
}
  • Вопрос задан
  • 147 просмотров
Пригласить эксперта
Ответы на вопрос 2
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Так у вас там сбой логики в коде, некорректно обрабатывается ситуация...
Всё, проблема решена?

P.S. А что вы хотели, каков вопрос - таков и ответ.
Без полных исходников вам никто в ошибку пальцем не ткнёт.
Ответ написан
@hesy Автор вопроса
Короче, решил вопрос переписав бота на Node.js.
Бот с лонгпулом вообще летает в отличии от пхп с вебхуком, я очень удивлён.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы