Реализация «Онлайн» на сайте
от Nolosha
Смотря на способ проверки онлайн пользователей:
В базу данных записывать IP и дату последнего загрузки страницы. Человек, переходя на любую страницу, обновляет время последней загрузки и таким образом остаётся на сайте. Или же другой юзер заходит на страницу, удаляет юзеров которые не переходили 5 минут ни на одну страницу и сам записывается.Я поняла, что нужно что-то усовершенствованное! Идея ко мне пришла в голову без стука!
Немного важного:
Да, я придумала этот способ. Такой имеется? Ничего страшного!Скажу, чем меня не устраивает способ "5 минут полёт нормальный":
• Неточность – мы видим как юзер сидит онлайн... а его как 2 (например) минуты уже нет! Мой же способ постарается максимально сразу объявить про отсутствие юзера на сайте.
• ...это все. Только из-за верхнего пункта мне не нравится этот способ.
Угадайте что мы будем использовать????
Правильно! - AJAX и MySQL!
Поэтому я возьму за основу мою прошлую статью Гостевая с AJAX. Мы будем проверять, находится ли кто-то в гостевой. И поэтому я добавила регистрацию и вход в свой «сайт» (показывать не буду). При создании сообщения я уберу поле имени так как теперь мы можем входить под аккаунтом (правда аккаунтом его не назовешь))))).
Вот код гостевой(потом разберем):
Метод outline нам будет отсоединять каждые 2 секунды всех юзеров.
Кстати, о базе данных:
В таблице где у вас хранятся зарегистрированные юзеры, нужно добавить новый столбец - in_guest (Тип INT). Он может иметь два значения: 0 если оффлайн, и 1 если в сети. Теперь мы сделаем наш файл обработчик. Смотрим на изменения:
Ещё раз поясню:
Загрузка сообщений происходит каждые 50 миллисекунд. Вместе с загрузкой сообщений происходит также обновление нас в сети. А каждые две секунды у нас будут все пользователи переходить в режим оффлайн. Естественно, чаще будет запись какого-то пользователя как online. В этом и заключается весь смысл.
Естественно? это всё стоит протестировать. Вот смотрите на результат:
Все, пока!
В базу данных записывать IP и дату последнего загрузки страницы. Человек, переходя на любую страницу, обновляет время последней загрузки и таким образом остаётся на сайте. Или же другой юзер заходит на страницу, удаляет юзеров которые не переходили 5 минут ни на одну страницу и сам записывается.Я поняла, что нужно что-то усовершенствованное! Идея ко мне пришла в голову без стука!
Немного важного:
Да, я придумала этот способ. Такой имеется? Ничего страшного!Скажу, чем меня не устраивает способ "5 минут полёт нормальный":
• Неточность – мы видим как юзер сидит онлайн... а его как 2 (например) минуты уже нет! Мой же способ постарается максимально сразу объявить про отсутствие юзера на сайте.
• ...это все. Только из-за верхнего пункта мне не нравится этот способ.
Угадайте что мы будем использовать????
Правильно! - AJAX и MySQL!
Поэтому я возьму за основу мою прошлую статью Гостевая с AJAX. Мы будем проверять, находится ли кто-то в гостевой. И поэтому я добавила регистрацию и вход в свой «сайт» (показывать не буду). При создании сообщения я уберу поле имени так как теперь мы можем входить под аккаунтом (правда аккаунтом его не назовешь))))).
Вот код гостевой(потом разберем):
- <html>
- <head>
- <title>Гостевая</title>
- <meta charset="UTF-8" />
- </head>
- <body>
- <h2>Отправить сообщение:</h2>
- <form method="post">
- <center>
- <input id='content' type="text" placeholder="Сообщение" required>
- <br/>
- <input id="send" type='button' value='Отправить'>
- </center>
- </form>
- <div class="messages"></div>
- <script src="https://code.jquery.com/jquery-3.1.1.js"></script>
- <script>
- $("#send").click(function() {
- $.ajax({
- type: 'POST',
- url: 'master.php',
- data: 'type=send&name=' + $('#name').val() + '&mes=' + $('#content').val(),
- success: function(data) {
- getContent();
- $('#content').val("");
- }
- });
- });
- function getContent() {
- $.ajax({
- type: 'POST',
- url: 'master.php',
- data: 'type=getContent',
- success: function(data) {
- $('.messages').html(data);
- }
- });
- }
- function outline(){//новый метод
- $.ajax({
- type: 'POST',
- url: 'recive.php' ,
- data: 'type=outline',
- success: function(data) { }
- });
- }
- setInterval(getContent, 2000);
- setInterval(getContent, 50);//ОБРАТИТЕ ВНИМАНИЕ, ЧТО ТЕПЕРЬ ЗДЕСЬ НЕ 400 А 50, ТЕПЕРЬ БУДЕТ БЫСТРЕЕ ЗАГРУЖАТЬСЯ
- </script>
- </body>
- </html>
Кстати, о базе данных:
В таблице где у вас хранятся зарегистрированные юзеры, нужно добавить новый столбец - in_guest (Тип INT). Он может иметь два значения: 0 если оффлайн, и 1 если в сети. Теперь мы сделаем наш файл обработчик. Смотрим на изменения:
- <?php
- $name = $_POST['name']; // Получаем переданные данные
- $mess = $_POST['mes']; // И тут
- // не забудьте отфильтровать ввод
- if ($_POST['type'] == "send") {
- // Это если мы отправляем сообщение
- if (trim($mess)){
- $mysqli = new mysqli("localhost","root","","mybase");
- $mysqli->query("INSERT INTO `messages` (`name`,`message`) VALUES (' ".$name." ',' ".$mess." ')");
- $mysqli->close();
- }
- }
- if ($_POST['type'] == 'outline') { //Если мы получили запрос на отсоединение то
- $mysqli = new mysqli("localhost","root","","mybase");
- $mysqli->query("UPDATE `users` SET `in_guest`='0'");//будем устанавливать in_guest на 0 (то есть делать оффлайн)
- }
- if ($_POST['type'] == "getContent") {
- // Обновить вСети
- $mysqli = new mysqli("localhost","root","","mybase");
- $mysqli->query("UPDATE `users` SET `in_guest`='1' WHERE `login`='".$log."'");//активируем самого себя на сайте. Это будет происходить очень часто, вместе с загрузкой сообщений.
- // Это получение сообщений
- $res = $mysqli->query("SELECT `name`,`message`,`user_id` FROM `messages` ORDER BY `id` DESC"); //user_id - сообщает об айди юзера, чтобы определить его в таблице users
- $msgs = ""; // переменная с будущим содержанием
- while (($rw = $res->fetch_assoc()) != false) {
- $r = $mysqli->query("SELECT `in_guest` FROM `users` WHERE `id`=".$row['user_id']);//тут будем выбирать статус(онлайн оффлайн) у юзера по айди
- $nw = '';
- if ($ro['in_guest'] == "1"){
- // если онлайн , оффлайн то статус...
- $nw = "<span style='font-size:12px;color: #3da544;letter-space: 2px;'>В ГОСТЕВОЙ</span>";
- }
- if ($ro['in_guest'] == "0"){
- $nw = "<span style='font-size:12px;color: #545048;letter-space: 2px;'>ВНЕ ГОСТЕВОЙ</span>";
- }//тут мы поигрались со стилями
- $ro = $r->fetch_assoc();
- $msgs .= "<div>".$row['name'].$nw."<br/><span>".$row['message']."</span></div><br/>"."<hr>"; //добавили вывод nw, то есть онлайн/оффлайн
- }
- $mysqli->close();
- echo $msgs; // И возвращаем результат
- }
- ?>
Загрузка сообщений происходит каждые 50 миллисекунд. Вместе с загрузкой сообщений происходит также обновление нас в сети. А каждые две секунды у нас будут все пользователи переходить в режим оффлайн. Естественно, чаще будет запись какого-то пользователя как online. В этом и заключается весь смысл.
Естественно? это всё стоит протестировать. Вот смотрите на результат:
Все, пока!