Короткий ответ: Telegram-бота на PHP запускают одним из двух способов. Polling — ваш скрипт сам регулярно запрашивает у Telegram новые сообщения через getUpdates. Webhook — Telegram сам отправляет обновления на ваш HTTPS-адрес. Для обучения проще polling, для постоянной работы на сайте чаще используют webhook
Важно не смешивать “написать бота” и “запустить бота”. Код может быть правильным, но бот не будет отвечать, если процесс не работает, webhook не установлен, сервер недоступен, токен неправильный или ошибки PHP скрыты
Вариант 1: запуск через polling
Polling подходит для локальной разработки, тестов и простых серверных запусков. Скрипт запускается в терминале и сам спрашивает Telegram о новых updates
Минимальная схема
<?php
$token = 'ВАШ_ТОКЕН';
$offset = 0;
while (true) {
$url = "https://api.telegram.org/bot{$token}/getUpdates?timeout=30&offset={$offset}";
$response = file_get_contents($url);
$data = json_decode($response, true);
foreach ($data['result'] ?? [] as $update) {
$offset = $update['update_id'] + 1;
$message = $update['message'] ?? null;
if (!$message) {
continue;
}
$chatId = $message['chat']['id'];
$text = $message['text'] ?? '';
$reply = 'Вы написали: ' . $text;
$sendUrl = "https://api.telegram.org/bot{$token}/sendMessage?" . http_build_query([
'chat_id' => $chatId,
'text' => $reply,
]);
file_get_contents($sendUrl);
}
}
Запуск
php bot.php
Пока процесс работает, бот отвечает. Если закрыть терминал, бот остановится. Для постоянной работы нужен process manager, systemd, supervisor, Docker или другой способ удерживать процесс
Вариант 2: запуск через webhook
Webhook подходит, когда у вас есть домен, HTTPS и сервер, который доступен Telegram. Вы создаете PHP-файл, например webhook.php, и говорите Telegram отправлять обновления на этот адрес
Пример обработчика
<?php
$token = 'ВАШ_ТОКЕН';
$input = file_get_contents('php://input');
$update = json_decode($input, true);
$message = $update['message'] ?? null;
if (!$message) {
exit;
}
$chatId = $message['chat']['id'];
$text = $message['text'] ?? '';
$url = "https://api.telegram.org/bot{$token}/sendMessage";
file_get_contents($url . '?' . http_build_query([
'chat_id' => $chatId,
'text' => 'Получил: ' . $text,
]));
Адрес должен открываться по HTTPS
https://example.com/webhook.php
Установка webhook
https://api.telegram.org/botВАШ_ТОКЕН/setWebhook?url=https://example.com/webhook.php
После установки проверьте состояние
https://api.telegram.org/botВАШ_ТОКЕН/getWebhookInfo
Если есть ошибка, Telegram обычно покажет last_error_message
Что выбрать новичку
Если вы только проверяете код, выбирайте polling. Он наглядный: запустили файл, написали боту, увидели ответ
Если бот должен жить на сайте и реагировать постоянно, выбирайте webhook. Но для webhook нужен нормальный HTTPS, доступный адрес, рабочий PHP на сервере и логи ошибок
Где хранить токен
Не храните токен в публичном репозитории и не выводите его в браузер. Для учебного файла токен можно временно вписать в переменную, но в рабочем проекте лучше использовать переменные окружения или конфигурационный файл вне публичной папки
Пример через переменную окружения
<?php
$token = getenv('TELEGRAM_BOT_TOKEN');
Как отлаживать запуск
Проверьте токен методом getMe. Затем проверьте, отвечает ли sendMessage при ручной подстановке chat_id. После этого проверяйте получение входящих updates. Не пытайтесь отлаживать все сразу
Для webhook полезно писать входящий JSON в лог-файл на время отладки
file_put_contents(__DIR__ . '/telegram.log', $input . PHP_EOL, FILE_APPEND);
После настройки лог лучше отключить или ограничить, чтобы не хранить лишние пользовательские данные
Мини-практика
Сначала запустите polling-бота в терминале и убедитесь, что он отвечает. Затем перенесите ту же логику в webhook.php, установите webhook и проверьте getWebhookInfo
Если webhook не работает, удалите его и вернитесь к polling
https://api.telegram.org/botВАШ_ТОКЕН/deleteWebhook
Так вы поймете, проблема в коде бота или именно в настройке webhook
Частые ошибки
Оставили старый webhook и пытаются использовать polling. Пока webhook активен, getUpdates может вести себя не так, как ожидается
Запустили polling в терминале и закрыли окно. Процесс завершился, бот перестал отвечать
Webhook стоит на HTTP, а не HTTPS. Telegram требует защищенный адрес для webhook
Файл webhook.php открывается с ошибкой 500. Telegram не сможет передать обновления, пока PHP падает
Токен попал в публичный код. Такой токен нужно перевыпустить
Не смотрят getWebhookInfo. Там часто прямо написано, почему Telegram не доставляет обновления
Что почитать дальше по PHP
Если нужен общий маршрут по теме, откройте рубрику PHP. Для соседних задач пригодятся эти разборы:
- Open Server: как запустить скачанные PHP-скрипты
- Telegram-бот на PHP: простой бот через Bot API
- Как запустить PHP-скрипт на сервере: файлы, права, браузер и cron
- Как запустить PHP-файл в браузере через localhost



