Часто на сайтах можно видите фразу, сейчас данный сайт просматривает столько-то человек, или даже список зарегистрированных посетителей, находящихся в данным момент на сайте. Обычно такой сервис называют «Список посетителей OnLine». Учитывая, что у посетителя может динамически меняться IP-адрес, или наоборот несколько посетителей могут выходить в Интернет из под одного IP-адреса, для подсчёта уникальных посетителей на сайте прибегают к сессиям. Создадим таблицу session в которой будем хранить уникальные идентификаторы сессии (SID), назначенные посетителям.
Таблица session
1 2 3 4 5 |
CREATE TABLE session ( id_session tinytext NOT NULL, putdate datetime NOT NULL default '0000-00-00 00:00:00', user tinytext NOT NULL ) TYPE=MyISAM; |
Таблица имеет три поля — id_session, поле, куда помещается SID сессии, поле putdate, для того, хранения времени обращения посетителя к страницам сайта и поле user, которое нами использоваться не будет, но в котором можно хранить имя пользователя, если у вас имеется система авторизации и вы хотите различать гостей и авторизованных пользователей. Предполагается, что имя пользователя помещается в элемент суперглобального массива $_SESSION[‘user’] — если вас интересует авторизация на PHP, с нейм можно ознакомиться по ссылке
В начало каждой страницы сайта, которая будет участвовать в регистрации посетителей следует при помощи конструкции require_once() поместить следующий код.
Скрипт регистрации посетителей в таблице session
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?php // Начинаем сессию session_start(); // Получаем уникальный id сессии $id_session = session_id(); // Устанавливаем соединение с базой данных include "config.php"; // Проверяем, присутствует ли такой id в базе данных $query = "SELECT * FROM session WHERE id_session = '$id_session'"; $ses = mysql_query($query); if(!$ses) exit("<p>Ошибка в запросе к таблице сессий</p>"); // Если сессия с таким номером уже существует, // значит пользователь online - обновляем время его // последнего посещения if(mysql_num_rows($ses)>0) { $query = "UPDATE session SET putdate = NOW(), user = '$_SESSION[user]' WHERE id_session = '$id_session'"; mysql_query($query); } // Иначе, если такого номера нет - посетитель только что // вошёл - помещаем в таблицу нового посетителя else { $query = "INSERT INTO session VALUES('$id_session', NOW(), '$_SESSION[user]')"; if(!mysql_query($query)) { echo $query."<br>"; echo "<p>Ошибка при добавлении пользователя</p>"; exit(); } } // Будем считать, что пользователи, которые отсутствовали // в течении 20 минут - покинули ресурс - удаляем их // id_session из базы данных $query = "DELETE FROM session WHERE putdate < NOW() - INTERVAL '20' MINUTE"; mysql_query($query); ?> |
Протокол HTTP не является сессионным протоколом, поэтому мы можем фиксировать только обращения посетителей к страницам сайта — сколько после этого посетитель будет читать страницу — одному богу известно — получить эту информацию мы не сможем. Поэтому мы будем считать, что если посетиель не обращается к страницам сайта более 20 минут — он ушёл и его можно удалять из таблицы session.
Теперь нам остаётся только вывести содержимое таблицы session или подсчитать число посетителей в ней.
Выводим содержимое таблицы session
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php // Устанавливаем соединение с базой данных include "config.php"; // Выводим имена всех посетителей, записи о которых имеются // в таблице session $query = "SELECT * FROM session"; $ath = mysql_query($query); if(!$ath) exit("<p>Ошибка в запросе к таблице сессий</p>"); // Если хоть кто-то есть - выводим таблицу if(mysql_num_rows($ath)>0) { echo "<table>"; while($author = mysql_fetch_array($ath)) { // Если посетитель не зарегистрирован // выводим вместо его имени - "аноним" if(empty($author['user'])) echo "<tr><td>аноним</td></tr>"; else echo "<tr><td>".$author['user']."</td></tr>"; } echo "</table>"; } ?> |
Для установки соединения с базой данных, нам потребуется конфигурационный файл config.php, следующего содержания.
Конфигурационный файл config.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php //////////////////////////////////////////////////////////// // 2003-2011 (C) IT-студия SoftTime (http://www.softtime.ru) //////////////////////////////////////////////////////////// // сейчас выставлен сервер локальной машины $dblocation = "localhost"; // Имя базы данных, на хостинге или локальной машине $dbname = "dbase"; // Имя пользователя базы данных $dbuser = "root"; // и его пароль $dbpasswd = ""; // Устанавливаем соединение с базой данных $dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd); if (!$dbcnx) { exit( "<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</P>" ); } // Выбираем базу данных if (! @mysql_select_db($dbname,$dbcnx) ) { exit( "<P>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</P>" ); } // Устанавливаем кодировку соединения @mysql_query("SET NAMES 'cp1251'"); ?> |