Updates

getUpdates and update_id

Telegram доставляет события боту пакетами Update. В режиме long polling вы сами забираете их методом getUpdates.

Минимальный запрос

$updates = telegramApi($token, 'getUpdates', [
    'timeout' => 25,
    'offset'  => $nextOffset, // последний update_id + 1
]);

update_id

Каждый Update имеет монотонно растущий update_id. Параметр offset говорит серверу: «всё до этого id уже обработано, больше не присылай».

  • после успешной обработки пачки сохраните max(update_id) + 1 как следующий offset;
  • если процесс упал до подтверждения offset — апдейт придёт снова.

Идемпотентность

Недостаточно «одного курсора в памяти», особенно при нескольких воркерах. Надёжный паттерн:

  1. получить Update;
  2. вставить update_id в таблицу с UNIQUE;
  3. если дубликат — пропустить;
  4. иначе выполнить бизнес-логику.
CREATE TABLE telegram_updates (
  update_id BIGINT PRIMARY KEY,
  received_at INT NOT NULL
);

Что внутри Update

Обычно одно из полей: message, edited_message, callback_query, inline_query, my_chat_member, pre_checkout_query, channel_post… Обрабатывайте только нужные типы, остальное игнорируйте явно.

Для продакшена чаще удобнее webhook: Telegram сам POST-ит апдейты на ваш HTTPS URL.