You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止PHP编写的Telegram Bot脚本自动退出

解决PHP Telegram Bot用getUpdates只跑一次就退出的问题

问题出在这几个地方

  1. 最外层循环完全无效:你写的for ($i= 0; $i >0; $i++),初始值$i=0根本不满足$i>0的条件,循环只执行一次就结束。
  2. 代码语法有漏洞:/test对应的if语句未闭合,导致后续/git的判断逻辑被嵌套进去,代码结构混乱可能引发脚本提前退出。
  3. 未处理更新偏移与长轮询:调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:16:09