@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;
}
  • Вопрос задан
  • 470 просмотров
Решения вопроса 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 покидаю. Всех благ)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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