发送响应并继续执行脚本

时间:2020-11-08 23:36:20

标签: php telegram telegram-bot

我正在创建一个高负载的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

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

1 个答案:

答案 0 :(得分:0)

我找到了一个适用于Telegram Bot API webhooks的简单解决方案。它使我可以直接在脚本本身内调用处理脚本,而无需使用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);

这样,脚本将自行调用(或其他任何脚本),电报将获得正确,快速的响应,而繁重的部分则分别执行。

强烈建议在CURLOPT_TIMEOUT_MS上保持不低于50毫秒,有时从电报接收请求时它有时不起作用。