Задать вопрос
@adsiflov

Почему лагает Telegram бот на PHP?

Всем привет, решил попробовать написать первого ТГ бота на PHP. Смотрю документацию, пишу код, ставлю вебхук. Короче, вроде всё хорошо идёт. Решил проверить результат. При отправке команды "/start" боту, в ответ приходят не все сообщения (всего должно прийти 3 меседжа). Только через некоторое время (как правило, пару минут) приходят "опоздавшие на поезд" сообщения от бота, при этом несколько раз (т.е. они дублируются). В инете ничего дельного не нашёл. Может кто-то сталкивался, или знает, как это разрулить? Код бота прикрепил ниже. Говорят, что здесь хорошее комьюнити. Надеюсь на вас, ребята.
<?php
$token = '';
$data = json_decode(file_get_contents("php://input"), true);
//file_put_contents('log2.txt', '$data: '.print_r($data, 1)."\n", FILE_APPEND);

function sqliQuery($query){
    $db = mysqli_connect('localhost', '', '', '');
    if(!$db){
        return('Error');
    }
    $result = mysqli_query($db, $query); 
    mysqli_close($link); 
    return $result;
}
function sendMess($message, $user_id){
    global $token;
    file_get_contents('https://api.telegram.org/bot'.$token.'/sendMessage?chat_id='.$user_id.'&text='.$message);   
}  
function sendKeyboard($message, $keyboard, $user_id){
    global $token;
    file_get_contents('https://api.telegram.org/bot'.$token.'/sendMessage?chat_id='.$user_id.'&text='.$message.'&reply_markup='.$keyboard);    
}    

if($data['message']){
    $message = $data['message']['text'];
    $user_id = $data['message']['chat']['id'];
    $name = $data['message']['chat']['first_name'];  
}
elseif($data['callback_query']){
    $message = $data['callback_query']['data'];
    $user_id = $data['callback_query']['from']['id'];
    $name = $data['callback_query']['from']['first_name'];
}

switch ($message) {
    case '/start':
        $qwery = sqliQuery("SELECT * FROM `user` WHERE `tg_id_user`='$user_id'");
        if(mysqli_num_rows($qwery)>0){
            sendMess('Привет, '.$name.'!', $user_id);
            sendMess('Это тестовый бот и я работаю, возможно даже с первого раза.', $user_id);
            $keyboard = json_encode(array('inline_keyboard' => array(array(array('text' => '✅ Ага','callback_data' => 'reg1',),array('text' => '❌ Не, боюсь!',callback_data => 'reg2',),),),));
            sendKeyboard('Зарегать?', $keyboard, $user_id);
        }
        break;
    case 'reg1':
        sqliQuery("INSERT INTO `user` (`tg_id_user`, `regdate`) VALUES('$user_id', '".time()."')");
        sendKeyboard('Зарегал, лол.',  $user_id);
        break;
    case 'reg2':
        sendKeyboard('Ладно, нет так нет.',  $user_id);
        break;
}
  • Вопрос задан
  • 562 просмотра
Подписаться 2 Средний 2 комментария
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
@adsiflov Автор вопроса
Что ж... Думал, что активность здесь повыше... Ну ладно. Дублирование сообщений помог прекратить код ниже.
function perevir($id_mess, $tg_id_user_mess, $date_mess){
    $qwery = sqliQuery("SELECT * FROM `zaroby_mess` WHERE `id_mess`='$id_mess' AND `tg_id_user_mess`='$tg_id_user_mess' AND `date_mess`='$date_mess'");
    if(mysqli_num_rows($qwery)>0){
        return exit;
    }
    else{
        sqliQuery("INSERT INTO `zaroby_mess` (`id_mess`, `tg_id_user_mess`, `date_mess`) VALUES('$id_mess', '$tg_id_user_mess', '$date_mess')");
    }
}

Если на запрос телеграм, сервер отвечает сообщением "OK 200", то всё хорошо. Если нет, то через минуту телега посылает ещё один запрос. В итоге может произойти так, что бот может отреагировать на запрос телеги несколько раз. Проверка поможет это исключить. Чтобы очищать базу можно подключить крон.
Код в вопросе, если что, создан на быструю руку для проверки работоспособности кода. Так писать не надо) Нужно хотя бы исключить возможность SQL-инъекций, не говоря уже про оптимизацию кода и всего прочего. Платформу QNA Habr покидаю. Всех благ)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы