我使用以下代码在php中制作一个简单的电报机器人:
$message = json_decode(file_get_contents('php://input'), true);
// if it's not a valid JSON return
if(is_null($message)) return;
$endpoint = "https://api.telegram.org/bot<token>/";
// make sure if text and chat_id is set into the payload
if(!isset($message["message"]["text"]) || !isset($message["message"]["chat"]["id"])) return;
// remove special characters, needed for the interpreter apparently
$text = $message["message"]["text"];
//$text = str_replace(["\r", "\n", "\t"], ' ', $text);
// saving chat_id for convenience
$chat_id = $message["message"]["chat"]["id"];
// show to the client that the bot is typing
file_get_contents($endpoint."sendChatAction?chat_id=".$chat_id."&action=typing");
file_get_contents($endpoint."sendMessage?chat_id=".$chat_id."&text=hi");
但问题是同时响应多个请求。用户没有实时接收响应(延迟)。 我确定最后一行会导致延迟并等待电报服务器的响应。 我怎么能弄明白呢?
更新 我发现了这段代码,但仍有延迟:
$ch = curl_init();
$curlConfig = array(
CURLOPT_URL => 'https://api.telegram.org/bot<token>/sendMessage',
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true);
$curlConfig[CURLOPT_POSTFIELDS] = "chat_id=".$chat_id."&text='hi'";
curl_setopt_array($ch, $curlConfig);
$result = curl_exec($ch);
curl_close($ch);
问题出在哪里?
答案 0 :(得分:2)
AS在评论中说,你可以使用一个简单的print语句在每个命令后输出(log)一个时间戳。通过查看差异,您可以看到每个命令花了多长时间。这应该足以确定简单函数中耗时的步骤。
另一种方法是使用分析器。 XDebug有一个内置的。但你必须设置它,我怀疑只是找出哪个步骤需要这么长时间才有理由......
然而,我眼中最优雅的想法是在php中使用一个鲜为人知的功能:ticks; - )
这允许注册&#34; tick&#34;功能一次,并在执行每个命令时自动输出一个勾号。这样可以避免使代码混乱。文档提供了一个很好的例子。
答案 1 :(得分:1)
Telegram Bots以两种不同的方式工作:
在前一种情况下,您设置了一个webhook,在后者中您不需要它,只需使用getUpdates API方法进行轮询。 好吧,你得到输入流,所以我猜你使用的是第一个推荐的方法,它比轮询更快,因为你收到了实时请求,你可以动态管理它。 Telegram向您发送JSON,其中包含您在同一请求期间必须处理的一个或多个元素,以避免更多连续消息之间的延迟:
// receives the request from telegram server
$message = json_decode(file_get_contents('php://input'), true);
// if it's not a valid JSON return
if(is_null($message)) return;
// check if data received doesn't contain telegram-side errors
if (!$message["ok"]) { return; }
// define remote endpoint
$endpoint = "https://api.telegram.org/bot<token>/";
// process each message contained in JSON request
foreach ($message["result"] as $request) {
// make sure if text and chat_id is set into the payload
if(!isset($request["message"]["text"]) || !isset($request["message"]["chat"]["id"])) return;
// remove special characters, needed for the interpreter apparently
$text = $request["message"]["text"];
//$text = str_replace(["\r", "\n", "\t"], ' ', $text);
// saving chat_id for convenience
$chat_id = $request["message"]["chat"]["id"];
// show to the client that the bot is typing
file_get_contents($endpoint."sendChatAction?chat_id=".$chat_id."&action=typing");
file_get_contents($endpoint."sendMessage?chat_id=".$chat_id."&text=hi");
}
让我知道这是否会减少延迟,快乐的开发! :)