Api icon indicating copy to clipboard operation
Api copied to clipboard

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

Open lordo opened this issue 3 years ago • 2 comments

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

		$bot->command('test', function ($message) use ($bot) 
		{
			$userid = $message->getChat()->getId();
					
			sleep(300);
					
			$bot->sendMessage($userid, "TEST");
		});

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

lordo avatar Mar 17 '22 11:03 lordo

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

uristA avatar Jun 30 '22 07:06 uristA

А это не проблема и её не надо решать. Таймаут срабатывает не у библиотеки, а у 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()

thorn2301 avatar Jun 30 '22 07:06 thorn2301

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");
		});

ghost avatar Apr 27 '23 11:04 ghost