php telegram bot countdown timer

Делаю на php телеграм бота при помощи библиотеки Guzzle. Не удаётся реализовать стоп таймера обратного отсчёта при помощи inline_keyboard: таймер 3:00 + кнопка "стоп". Таймер работает обновляя это же сообщение с кнопкой:

if ($callback == "stop timer") {
    file_put_contents('timer.txt', 1);
    $bot->sendMessageCallbackUpdate("timer stopped", [[["text"=>"new button", "callback_data"=>"new data"]]]);
} else if ($callback == $timer) {
    file_put_contents('timer.txt', 0);
    $time = 180;
    $min = floor($time/60);
    $sec = $time % 60;
    for ($min; $min >= 0; $min--) {
        for ($sec; $sec >= 0; $sec--) {
            if (file_get_contents('timer.txt') == 1) {              //Даже такой костыль не работает
                $bot->sendMessageCallbackUpdate("timer stopped", [[["text"=>"new button", "callback_data"=>"new data"]]]);
                break 2;
            }
            sleep(1);
            $text = sprintf("timer: %'.02d:%'.02d", $min, $sec);
            $bot->sendMessageCallbackUpdate($text, [[["text"=>"stop", "callback_data"=>"stop timer"]]]);
        }
        $sec = 59;
    }
}

$callback не начинает обрабатываться снова, пока не закончится весь цикл с функцией sleep(), а уже потом изменяет и сообщение с кнопкой, и файл.

При этом, если сделать подобную реализацию через прямое сообщение в чате - файл изменится, таймер остановится.

Но можно ли остановить таймер кнопкой в этом же сообщении? Или подскажите другую реализацию, пожалуйста.


Ответы (1 шт):

Автор решения: jason

Поправка: через прямое сообщение в чате - файл изменится, таймер остановится. Останавливается не каждый раз, особенно если прошло несколько циклов. Пока таймер не дойдёт до конца - новые команды бот исполнять не будет.

Я додумался до того, что нужно запустить таймер в новом процессе асинхронно, якобы sleep() замораживает весь скрипт. Но потом подумал - ведь новые вебхуки от телеграма должны приходить асинхронно и без того? Есть сообщение от юзера - вебхук открывает скрипт и исполняет его построчно.

Так почему цикл со sleep() мешает исполнить новый запрос боту? А что если для одного юзера бота висит sleep(), то и все остальные будут ждать?

Я в полном замешательстве, не знаю уже и куда копать. Дайте хоть какое-то направление.

→ Ссылка