Обнаружена ошибка "Тайм-аут чтения истек" 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 и узнать, какой запрос времени ожидания был сделан.

ПРИМЕЧАНИЕ. Если метод получения исходного обновления отличается от моего, измените его в соответствии с вашим источником.

ПРИМЕЧАНИЕ: Если вы знаете, что ваш сценарий занимает больше минуты, это не сработает для вас.

Другие вопросы по тегам