Реализация Кто онлайн
![Реализация Кто онлайн](/images/articles/php-who-online.jpg)
Наверняка, Вы часто видели на разных сайтах информацию о количестве online-пользователей, то есть пользователей, которые непосредственно находятся сейчас на сайте. Например, "Кто онлайн" часто добавляют на форумы, социальные сети, различные сервисы, причём даже пишут конкретные логины пользователей, находящихся на сайте. Я решил, что в этой статье разберу, как реализовать "Кто онлайн" на сайте.
Первым делом необходимо понять принцип работы "Кто онлайн". А принцип следующий: каждый пользователь, который не активен более заданного времени, выбывает из списка online. Каждый новый пользователь добавляется в список online. И этот список хранится в базе данных. Те, кто уже неплохо разбирается в PHP и MySQL, без проблем реализуют всё это. Однако, на всякий случай, распишу подробную инструкцию:
- Создать таблицу в базе данных со следующими полями:
- id - уникальный идентификатор каждой записи.
- user_id - уникальный идентификатор, соответствующий определённому пользователю. Другими словами, если у Вас есть регистрация, то в таблице с пользователями должен быть указан их id. Вот именно в это поле и необходимо помещать этот id.
- last_time - количество секунд прошедших с полуночи 01.01.1970 до последней активности пользователя. Это количество секунд легко получается с помощью функции time().
- На каждой странице сайта, на каждом скрипте, необходимо реализовать следующий алгоритм:
- Получить информацию об активности пользователя, вызвавшего этот скрипт. Если этот пользователь находится в таблице, то надо просто обновить поле last_time у него. Если его там нет, то необходимо добавить этого пользователя в таблицу.
- Удалить всех online-пользователей из таблицы, у которых время неактивности превышает заданное, простым SQL-запросом.
Всё, это весь алгоритм. Он, на самом деле, очень простой и самый частоиспользуемый. Что касается времени, через которое пользователь считается за offline, то здесь советую выбрать 30 минут. А сам принцип, надеюсь, стал понятен: каждый пользователь, который переходит на любую страницу сайта, вызывает добавление себя в список online (или обновление last_time, если он там уже был), а также удаление уже неактивных пользователей.
Также вместо user_id можно использовать IP-адрес. Тогда можно реализовать, не сколько зарегистрированных пользователей, а сколько вообще людей находится на сайте.
Я очень рекомендую реализовать этот алгоритм, даже если он Вам кажется совсем простым. А возникшие вопросы Вы можете задать в комментариях.
-
-
Михаил Русаков
Комментарии (24):
Насчет обновления поля last_time понятно - это делает сам пользователь, активничая на сайте. А вот кто вызовет команду удаления неактивных пользователей? Как запустить скрипт автоматом?
Ответить
Каждый пользователь не только обновляет себя, как активного, но он же и удаляет неактивных. Можно ещё написать отдельный скрипт и запустить его в cron на запуск через заданные интервалы. Результат будет тот же.
Ответить
круто)
Ответить
А вот у меня столбец online находится в одной и том же столбике, что и вся инфа о юзере, в общем вот id login password avatar email activation date online Эта структура таблицы users, вот например в начале каждого php-шного файла у меня подключается такой код идентифицирующий пользователя который ввел свои данные и вошел под своими данными... if (isset($_COOKIE['auto']) and isset($_COOKIE['login']) and isset($_COOKIE['password'])) { if ($_COOKIE['auto'] == 'yes') { $_SESSION['password']=strrev(md5($_COOKIE['password']))."000000"; $_SESSION['login']=$_COOKIE['login']; $_SESSION['id']=$_COOKIE['id']; } } if (!empty($_SESSION['login']) and !empty($_SESSION['password'])) { $login = $_SESSION['login']; $password = $_SESSION['password']; $result = mysql_query("SELECT id,avatar FROM users WHERE login='$login' AND password='$password' AND activation='1'",$db); $myrow = mysql_fetch_array($result); } А вот как мне вытащить данные например именно того пользователя на странице которого я сижу, то есть мне нужно написать запрос на отображение онлайн ли он или нет, когда я сижу под своими данными чтоб мне это видеть... Не могу понять как это сделать и все, думал сделать через while и do, но эта мысль отпала , поняв что этот способ не подойдет. Ох надеюсь вы прочтете мой бред и спасете меня в очередной раз=)
Ответить
Допустим, страница, на которой выводится информация называется user.php. Чтобы выводить информацию на страницу именно того пользователя, который требуется, нужно передать get-параметр. То есть в реальности ссылка на страницу будет user.php?id=17. При переходе по такому адресу выводится тот пользователь, чей id=17.
Ответить
дело все в том что у меня стоит условие если вы находитесь на странице с id=1 то есть своим, то вам выводится одна информация, а если эта страница не ваша то вам выводится другая информация, все это происходит по сессионным логам...
Ответить
Где и как указать (прописать) это время - 30 минут
Ответить
В конфигурационном файле, например.
Ответить
Понял. 1. А как проверить время, после которого скрипт будет удалять пользователя? И как узнать кого удалять? Это надо уметь работать с функцией time()? А есть этот материал? 2. Как удалить из базы (таблицы) записи, которые не соответствуют нужной мне переменной?
Ответить
3. А можно пользователям запустить бесконечную сессию? Или хотя бы на очень долгое время? Как это сделать?
Ответить
Не стоит этого делать, все файлы хранятся на сервере и рано или поздно место закончится.
Ответить
Тут надо много, чего уметь. В статье надо алгоритм, а не код. Готовые скрипты на других сайтах, а здесь обучение. Вот это почитайте http://myrusakov.ru/php-how-study.html
Ответить
А почему Интернет-Эксплоер не пропускает изображения jpg jpeg JPG JPEG такой проверкой: $type = $_FILES['somename']['type']; if (($type != "image/gif") && ($type != "image/jpeg") && ($type != "image/png") && ($type != "image/JPG") && ($type != "image/jpg")) { echo "выход"; exit; }
Ответить
Посмотрите значение $type через echo.
Ответить
А что я там должен увидеть?
Ответить
Посмотреть значение $type.
Ответить
Показало вот это: image/pjpeg Что это значит? Это какой-то новый формат изображений? Оно безопасное? Его стоит добавлять в список допустимых? Или это подделка?
Ответить
Оно безопасное, просто mime-type отправляет браузер, и вот IE, как всегда, отличился.
Ответить
А вы не можете по этому урок записать?
Ответить
В любом случае,если Вы не будете знать php,то не поймёте о чём речь в уроке =)
Ответить
Та знаю я php но много чего немонимаю, но а в видео уроке все легче запоминается.
Ответить
ну,во первых.Раз вы знаете php,то отдельно от остальных этот скрипт не напишешь,так как он неуместен будет Во-вторых,если вы знаете php,то,как по мне,то технология тут расписана довольно понятно. Такие вот дела. Если Михаил захочет,то сделает урок на данную тему,но не думаю,что это актуально
Ответить
Это кому как, кому-то не сложно это сделать, ну а некоторым посложнее, вот и здесь даже сколько переспрашивали, так не лучше записать урок, а уже в процесе каждый сделает под себя как удобно!
Ответить
Для этого нужно создать отдельную таблицу online или добавить поля в таблицу users?
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.