TelegramBot / Api

Native PHP Wrapper for Telegram BOT API
MIT License
1.09k stars 323 forks source link

Зацикливание ответов при долгом выполнении команды #366

Closed ghost closed 1 year ago

ghost commented 2 years ago

Для воспроизведение проблемы можно использовать функцию

        $bot->command('test', function ($message) use ($bot) 
        {
            $userid = $message->getChat()->getId();

            sleep(300);

            $bot->sendMessage($userid, "TEST");
        });

В таком случае после отправки команды /test телеграм начинает присылать event с одним и тем же update_id чем вызывает обработку функции снова и снова

uristA commented 2 years ago

так и не решили проблему ?

thorn2301 commented 2 years ago

А это не проблема и её не надо решать. Таймаут срабатывает не у библиотеки, а у API телеграм. Если PHP-FPM, то можно просто первой командой скрипту передать fastcgi_finish_request();

Например если:

$bot->command('test', function ($message) use ($bot) 
        {
            $userid = $message->getChat()->getId();
                        fastcgi_finish_request();

            sleep(300);

            $bot->sendMessage($userid, "TEST");
        });

то все отработает единожды

если mod_php (х.з. зачем), то стоит обратить внимание на буферизацию вывода: ob_start() ob_get_contents() ob_get_flush() ob_flush() ob_end_clean() ob_end_flush()

ghost commented 1 year ago

So fastcgi_finish_request is good solution if u have defined fastcgi_finish_request function, but if u not have it (its me) u can use this code to do same wihtout fastcgi_finish_request function:

                $bot->command('test', function ($message) use ($bot) 
        {
            $userid = $message->getChat()->getId();

            http_response_code(200);
            ignore_user_abort(true);
            header("Content-Length: 0");
            header("Connection: Close");
            flush();
            session_write_close();

            sleep(300);

            $bot->sendMessage($userid, "TEST");
        });