【问题标题】:Send response and continue executing script发送响应并继续执行脚本
【发布时间】:2021-02-20 22:18:01
【问题描述】:

我正在创建一个高负载的 Telegram Bot,这意味着会有很多请求进来,它们需要时间来处理。 我使用 webhook(Telegram 将更新发送到,比如说,handler.php),它需要以正确的[] 答案进行响应,并完全关闭 Telegram 的连接以发送下一个更新。否则 Telegram 只会增加 pending_update_count 并且不会发送任何新的更新,直到处理前一个。

所以我要做的是在执行代码之前正确响应并关闭连接。

StackOverflow 提出了一些解决方案。但这些都不适合我,因为它们只会在没有输出时关闭连接,我需要回复[]

How do I close a connection early?

Send response and continue executing script - PHP

我想出的唯一解决方法是从handler.php 调用shell_exec('php sendMessage.php >/dev/null 2>/dev/null &')。效果很好,但这不是我需要的。是否有其他响应和关闭连接的建议,以便代码可以在后台执行?

【问题讨论】:

    标签: php telegram telegram-bot


    【解决方案1】:

    我找到了一个适用于 Telegram Bot API webhook 的简单解决方案。它允许我直接在脚本本身内调用处理脚本,而无需使用exec()shell_exec()

    耗时的代码

    $bool = true; // some condition in your regular code
    if($bool) {
        sleep(10);
    }
    

    这将对其他机器人用户造成巨大的延迟,因为 Telegram 没有收到响应并且不会向您发送任何其他更新。

    解决方案

    if(isset($_GET['action'])) {
        sleep(10);
    }
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://localhost/handler.php?action');
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 50);
    curl_exec($ch);
    curl_close($ch);
    

    这样脚本会调用自己(或任何其他脚本),Telegram 将得到正确和快速的响应,而重的部分是单独执行的。

    强烈建议不要在CURLOPT_TIMEOUT_MS 上低于 50 毫秒,有时它在接收来自 Telegram 的请求时不起作用。

    【讨论】:

      猜你喜欢
      • 2018-03-24
      • 2011-04-19
      • 1970-01-01
      • 2020-07-24
      • 2021-10-11
      • 2017-03-22
      • 2018-09-19
      相关资源
      最近更新 更多