0

最近我遇到了一个我以前没有遇到过的电报 bot api 问题......我使用 Webhook 连接方法来捕获机器人请求并使用 PHP 脚本重新发送,有时触发的脚本需要一分钟以上才能完成处理。大约一个月前,一切正常,电报机器人等待足够长的时间让脚本完全执行,但现在我的连接暂停,我在执行 60 秒后通过电报 api “读取超时过期”收到此 Webhook 错误,然后它尝试相同再次请求,这些一直持续到我的服务器因打开条目过多而过载...我已经尝试过连接处理虽然它似乎没用,因为我的连接不是浏览器端。我意识到它应该与 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 在运行上述脚本 60 秒后对我的 Webhook 状态的响应:

{"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}}

4

2 回答 2

0

这是我放在脚本顶部的代码。它响应电报,因此他们停止等待,脚本继续处理。

<?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();
    }
于 2017-09-16T18:42:08.523 回答
0

将此代码放在更新变量之后:

<?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 并找出已发出的超时请求。

注意:如果接收源更新的方法与我的不同,请根据您的源进行更改。

注意:如果您知道您的脚本需要一分钟以上,这对您不起作用。

于 2020-09-24T09:48:21.803 回答