Реализация «Онлайн» на сайте

от
PHP/MySQL   php, js, query

Смотря на способ проверки онлайн пользователей:
В базу данных записывать IP и дату последнего загрузки страницы. Человек, переходя на любую страницу, обновляет время последней загрузки и таким образом остаётся на сайте. Или же другой юзер заходит на страницу, удаляет юзеров которые не переходили 5 минут ни на одну страницу и сам записывается.Я поняла, что нужно что-то усовершенствованное! Идея ко мне пришла в голову без стука!
Немного важного:
Да, я придумала этот способ. Такой имеется? Ничего страшного!
Скажу, чем меня не устраивает способ "5 минут полёт нормальный":
• Неточность – мы видим как юзер сидит онлайн... а его как 2 (например) минуты уже нет! Мой же способ постарается максимально сразу объявить про отсутствие юзера на сайте.
• ...это все. Только из-за верхнего пункта мне не нравится этот способ.

Угадайте что мы будем использовать????
Правильно! - AJAX и MySQL!
Поэтому я возьму за основу мою прошлую статью Гостевая с AJAX. Мы будем проверять, находится ли кто-то в гостевой. И поэтому я добавила регистрацию и вход в свой «сайт» (показывать не буду). При создании сообщения я уберу поле имени так как теперь мы можем входить под аккаунтом (правда аккаунтом его не назовешь))))).

Вот код гостевой(потом разберем):
  1. <html>
  2. <head>
  3.     <title>Гостевая</title>
  4.     <meta charset="UTF-8" />
  5. </head>
  6. <body>
  7.     <h2>Отправить сообщение:</h2>
  8.     <form method="post">
  9.         <center>
  10.             <input id='content' type="text" placeholder="Сообщение" required>
  11.             <br/>
  12.             <input id="send" type='button' value='Отправить'>
  13.         </center>
  14.     </form>
  15.     <div class="messages"></div>
  16.     <script src="https://code.jquery.com/jquery-3.1.1.js"></script>
  17.     <script>
  18.         $("#send").click(function() {
  19.             $.ajax({
  20.                 type: 'POST',
  21.                 url: 'master.php',
  22.                 data: 'type=send&name=' + $('#name').val() + '&mes=' + $('#content').val(),
  23.                 success: function(data) {
  24.                     getContent();
  25.                     $('#content').val("");
  26.                 }
  27.             });
  28.         });
  29.  
  30.         function getContent() {
  31.             $.ajax({
  32.                 type: 'POST',
  33.                 url: 'master.php',
  34.                 data: 'type=getContent',
  35.                 success: function(data) {
  36.                     $('.messages').html(data);
  37.                 }
  38.             });
  39.         }
  40.  
  41.         function outline(){//новый метод
  42.             $.ajax({
  43.                 type: 'POST',
  44.                 url: 'recive.php' ,
  45.                 data: 'type=outline',
  46.                 success: function(data) { }
  47.             });
  48.         }
  49.  
  50.         setInterval(getContent, 2000);
  51.         setInterval(getContent, 50);//ОБРАТИТЕ ВНИМАНИЕ, ЧТО ТЕПЕРЬ ЗДЕСЬ НЕ 400 А 50, ТЕПЕРЬ БУДЕТ БЫСТРЕЕ ЗАГРУЖАТЬСЯ
  52.     </script>
  53. </body>
  54. </html>
Метод outline нам будет отсоединять каждые 2 секунды всех юзеров.

Кстати, о базе данных:
В таблице где у вас хранятся зарегистрированные юзеры, нужно добавить новый столбец - in_guest (Тип INT). Он может иметь два значения: 0 если оффлайн, и 1 если в сети. Теперь мы сделаем наш файл обработчик. Смотрим на изменения:

  1. <?php
  2. $name = $_POST['name']; // Получаем переданные данные
  3. $mess = $_POST['mes']; // И тут
  4. // не забудьте отфильтровать ввод
  5.  
  6. if ($_POST['type'] == "send") {
  7.     // Это если мы отправляем сообщение
  8.     if (trim($mess)){
  9.         $mysqli = new mysqli("localhost","root","","mybase");
  10.         $mysqli->query("INSERT INTO `messages` (`name`,`message`) VALUES (' ".$name." ',' ".$mess." ')");
  11.         $mysqli->close();
  12.     }
  13. }
  14.  
  15. if ($_POST['type'] == 'outline') { //Если мы получили запрос на отсоединение то
  16.     $mysqli = new mysqli("localhost","root","","mybase");
  17.     $mysqli->query("UPDATE `users` SET `in_guest`='0'");//будем устанавливать in_guest на 0 (то есть делать оффлайн)
  18. }
  19.  
  20. if ($_POST['type'] == "getContent") {
  21.     // Обновить вСети
  22.     $mysqli = new mysqli("localhost","root","","mybase");
  23.     $mysqli->query("UPDATE `users` SET `in_guest`='1' WHERE `login`='".$log."'");//активируем самого себя на сайте. Это будет происходить очень часто, вместе с загрузкой сообщений.
  24.  
  25.     // Это получение сообщений
  26.     $res = $mysqli->query("SELECT `name`,`message`,`user_id` FROM `messages` ORDER BY `id` DESC"); //user_id - сообщает об айди юзера, чтобы определить его в таблице users
  27.  
  28.     $msgs = ""; // переменная с будущим содержанием
  29.     while (($rw = $res->fetch_assoc()) != false) {
  30.         $r = $mysqli->query("SELECT `in_guest` FROM `users` WHERE `id`=".$row['user_id']);//тут будем выбирать статус(онлайн оффлайн) у юзера по айди
  31.  
  32.         $nw = '';
  33.         if ($ro['in_guest'] == "1"){
  34.             // если онлайн , оффлайн то статус...
  35.             $nw = "<span style='font-size:12px;color: #3da544;letter-space: 2px;'>В ГОСТЕВОЙ</span>";
  36.         }
  37.         if ($ro['in_guest'] == "0"){
  38.             $nw = "<span style='font-size:12px;color: #545048;letter-space: 2px;'>ВНЕ ГОСТЕВОЙ</span>";
  39.         }//тут мы поигрались со стилями
  40.  
  41.         $ro = $r->fetch_assoc();
  42.         $msgs .= "<div>".$row['name'].$nw."<br/><span>".$row['message']."</span></div><br/>"."<hr>"; //добавили вывод nw, то есть онлайн/оффлайн
  43.     }
  44.     $mysqli->close();
  45.     echo $msgs; // И возвращаем результат
  46. }
  47. ?>
Ещё раз поясню:
Загрузка сообщений происходит каждые 50 миллисекунд. Вместе с загрузкой сообщений происходит также обновление нас в сети. А каждые две секунды у нас будут все пользователи переходить в режим оффлайн. Естественно, чаще будет запись какого-то пользователя как online. В этом и заключается весь смысл.
Естественно? это всё стоит протестировать. Вот смотрите на результат:
20190214-205949.jpg
Все, пока!
-2   3   5
402