Обнаружена ошибка "Тайм-аут чтения истек" Webhook после 60 секунд выполнения
В последнее время я сталкиваюсь с проблемой с telegram бота api, которой у меня не было раньше... Я использую метод подключения Webhook для перехвата запросов ботов и повторного кодирования с помощью PHP-скрипта, и иногда запускаемый скрипт занимает больше минуты, чтобы закончить обработку. около месяца назад все работало нормально, и бот telegram ждал достаточно долго для полного выполнения скрипта, но теперь мое соединение приостанавливается, и я получаю эту ошибку Webhook через telegram api "Время ожидания истекло" после 60 секунд выполнения, а затем пытается выполнить то же самое запрашивать снова, и это продолжается и продолжается, пока мой сервер не перегружается слишком большим количеством открытых записей... я уже пробовал обработку соединений, хотя это казалось бесполезным, так как мое соединение не на стороне браузера. я понимаю, что это должно быть как-то связано с настройкой Webhook, но я не могу понять... есть идеи?
Вот то, что может дать вам цифру:
мой код:
<?php
...running hundreds of thousands of multi-curl requests that take 10 min for example
...or/ sleep(61);
...or/ basically anything that takes more than 60 seconds to run
?>
Ответ Telegram на состояние моего Webhook через 60 секунд после запуска вышеуказанного скрипта:
{"ok": true, "result": {"url": " https:????.com/??.php", "has_custom_certificate": false, "pending_update_count": 1, "last_error_date": 1499351442, "last_error_message": "Тайм-аут чтения истек","max_connections":40}}
1 ответ
Это код, который я положил в верхней части моих сценариев. он отвечает на телеграмму, поэтому они перестают ждать, а сценарии продолжают обрабатываться.
<?php
set_time_limit(0);
ignore_user_abort(true);
$out = json_encode([
'method'=>'sendMessage',
'chat_id'=>$my_chat_id,
'text'=> "Starting process..."
]);
echo $out;
header('Connection: close');
header('Content-Length: '.strlen($out));
header("Content-type:application/json");
flush();
if (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
}
Поместите этот код после переменной обновления:
<?php
$update = json_decode(file_get_contents('php://input'));
if(isset($update->message) || isset($update->edited_message)) {
if(time()-((@$update->message->date)?:(@$update->edited_message->date)) > 59) {
/* print json update*/ exit('Update Time Out !');
}
}
ПРИМЕЧАНИЕ. Конечно, вы также можете получить обновление для получения Json и узнать, какой запрос времени ожидания был сделан.
ПРИМЕЧАНИЕ. Если метод получения исходного обновления отличается от моего, измените его в соответствии с вашим источником.
ПРИМЕЧАНИЕ: Если вы знаете, что ваш сценарий занимает больше минуты, это не сработает для вас.