Часто на сайтах можно видите фразу, сейчас данный сайт просматривает столько-то человек, или даже список зарегистрированных посетителей, находящихся в данным момент на сайте.
Обычно такой сервис называют «Список посетителей OnLine». Учитывая, что у посетителя может динамически меняться IP-адрес, или наоборот несколько посетителей могут выходить в Интернет из под одного IP-адреса, для подсчёта уникальных посетителей на сайте прибегают к сессиям.
Создадим таблицу session в которой будем хранить уникальные идентификаторы сессии (SID), назначенные посетителям.
Таблица session
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
<?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
<?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
<?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'");
?>