бот telegram — Как обрабатывать несколько запросов в PHP?

Я использую приведенный ниже код для создания простого бота телеграммы в 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);

В чем проблема?

1

Решение

Как сказано в комментариях, вы можете использовать простой оператор печати для вывода (записи) отметки времени после каждой команды. Посмотрев на различия, вы увидите, сколько времени заняла каждая команда. Этого должно быть достаточно, чтобы идентифицировать трудоемкий шаг в простой функции.

Альтернативой будет использование профилировщика. XDebug имеет один встроенный. Но вы должны настроить это, я сомневаюсь, что это оправдано, просто чтобы узнать, какой шаг занимает так много времени …

Однако самая изящная идея на мой взгляд — использовать малоизвестную функцию в php: тиков 😉

Это позволяет зарегистрировать функцию «галочка» один раз и автоматически выводить галочку с каждой выполненной командой. Это избавит вас от необходимости испортить ваш код. Документация дает хороший пример.

2

Другие решения

Telegram Bots работают двумя разными способами:

  • Прямые запросы https (необходимо настроить ssl-сертификат);
  • Длинные запросы на опрос (ваш скрипт продолжает поиск обновлений).

В первом случае вы устанавливаете webhook, во втором он вам не нужен, просто опрос с помощью метода API getUpdates.
Что ж, вы получаете поток ввода, поэтому я полагаю, что вы используете первый рекомендуемый метод, который быстрее, чем опрос, потому что вы получаете запрос в реальном времени и можете управлять им на лету.
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");

}

Дайте мне знать, если это уменьшит задержку, счастливый разработчик! 🙂

1

По вопросам рекламы [email protected]