如何阻止PHP编写的Telegram Bot脚本自动退出
解决PHP Telegram Bot用getUpdates只跑一次就退出的问题
问题出在这几个地方
- 最外层循环完全无效:你写的
for ($i= 0; $i >0; $i++),初始值$i=0根本不满足$i>0的条件,循环只执行一次就结束。 - 代码语法有漏洞:
/test对应的if语句未闭合,导致后续/git的判断逻辑被嵌套进去,代码结构混乱可能引发脚本提前退出。 - 未处理更新偏移与长轮询:调用
getUpdates时没传offset参数,会重复获取旧消息;也未启用长轮询,脚本拿完一次消息后直接终止。
修复步骤
1. 替换为无限循环
把最外层的错误循环改成while(true),让脚本持续运行,直到你手动终止(比如按Ctrl+C)。
2. 补全语法逻辑
闭合/test的if语句,同时补上原代码遗漏的/test命令消息发送逻辑(原代码只定义了$reply但未调用发送方法)。
3. 添加更新偏移与长轮询
调用getUpdates时传入offset参数,记录最后处理的更新ID,确保只获取未处理的新消息;同时设置timeout启用长轮询,让Telegram服务器有新消息时再返回响应,减少无效请求。
4. 禁用脚本超时
添加set_time_limit(0),防止PHP因脚本运行时间过长自动终止进程。
修正后的完整代码
<?php set_time_limit(0); // 禁用脚本超时限制 include 'Telegram.php'; $bot_token = 'xyz'; $telegram = new Telegram($bot_token); $last_update_id = 0; // 存储最后处理过的更新ID // 无限循环持续监听新消息 while (true) { // 调用getUpdates,通过offset获取未处理消息,timeout启用长轮询 $req = $telegram->getUpdates([ 'offset' => $last_update_id + 1, 'timeout' => 30 // 30秒内有新消息立即返回,无消息则等待30秒 ]); // 遍历处理所有新更新 for ($i = 0; $i < $telegram->UpdateCount(); $i++) { $telegram->serveUpdate($i); $text = $telegram->Text(); $chat_id = $telegram->ChatID(); $current_update_id = $telegram->UpdateID(); // 更新最后处理的ID,避免重复处理旧消息 if ($current_update_id > $last_update_id) { $last_update_id = $current_update_id; } // 处理/start命令 if ($text == '/start') { $reply = 'Working'; $content = ['chat_id' => $chat_id, 'text' => $reply]; $telegram->sendMessage($content); } // 处理/test命令,补全发送逻辑 if ($text == '/test') { $reply = $telegram->messageFromGroup() ? 'Chat Group' : 'Private Chat'; $content = ['chat_id' => $chat_id, 'text' => $reply]; $telegram->sendMessage($content); } // 处理/git命令 if ($text == '/git') { $reply = 'Check me on GitHub: https://github.com/Eleirbag89/TelegramBotPHP'; $content = ['chat_id' => $chat_id, 'text' => $reply]; $telegram->sendMessage($content); } } // 添加短延迟,避免极端场景下的高频请求 usleep(100000); // 延迟100毫秒 } ?>
额外说明
- 长轮询的
timeout=30:Telegram服务器会保持连接30秒,期间有新消息立即返回,无消息则到时间后返回空,减少无效请求次数。 offset参数:确保每次只获取未处理的新消息,避免重复回复同一消息。- 脚本终止方式:运行后按
Ctrl+C可手动终止,或直接关闭终端。
内容的提问来源于stack exchange,提问作者Ameer
相关产品推荐
相关产品推荐

