Pers.narod.ru. PHP. Статьи. Простая проверка количества пользователей онлайн |
...что значит "простая"? Прежде всего, не использующая базу данных и кучу статистических записей. При этом хотелось бы, чтоб статистика была более-менее достоверной.
Используем для учёта онлайн-посетителей механизм сессий, то есть, вызов
session_start();
обязателен. Лучше всего его делать в самом начале кода, подключаемого ко всем страницам сайта.
Примечание: для действительно загруженных сайтов это чревато большой нагрузкой на сервер! Ведь каждый раз, как минимум, создаётся временный файл сессии на диске.
Нашему модулю понадобится 3 настройки, определим их константами:
define ("MAX_IDLE_TIME", "3"); //Время в минутах, которое сессия считается "онлайн" define ("SESSION_PATH", ""); //Путь для сессий без слеша в конце define ("SESSION_PREFIX","sess_"); //Начало имен всех файлов сессий, обычно такое и есть
По умолчанию настройка SESSION_PATH
оставлена пустой, на реальном хостинге её, скорее всего, придётся заполнить,
вызвав стандартную функцию
phpinfo()
и прочитав в её выводе значение настройки session.save_path
файла php.ini
. Если там ничего нет (написано no value
),
придётся подобрать папку опытным путём или же назначить её самому (см. ниже), у меня на хостинге оказалось
define ("SESSION_PATH", "/tmp");
Функция session_save_path()
, если она вызывана с параметром, устанавливает, а не читает директорию для сессий.
Скрипту это нужно будет делать, если настройка SESSION_PATH
непуста. Кроме того, нижеследующую строку кода нужно вписать до
вызова функции session_start
:
if (SESSION_PATH!='') session_save_path (SESSION_PATH);
Теперь напишем функцию для определения числа "активных" сессий, то есть, таких, с момента создания которых не прошло
MAX_IDLE_TIME
минут.
function getOnlineUsers() { if ($directory = opendir(session_save_path())) { $count = 0; $n = strlen(SESSION_PREFIX); while (false !== ($file = readdir($directory))) { if (substr($file,0,$n)==SESSION_PREFIX) { if (time()-fileatime(session_save_path().'/'.$file) < MAX_IDLE_TIME*60) { $count++; } } } closedir ($directory); return $count; } else { return false; } }
После этого там, где удобно, просто вызовем нашу функцию:
echo 'Пользователей онлайн: '.getOnlineUsers();
В этом скрипте нет детальной статистики – он сможет только узнать количество пользователей онлайн, для получения любых более подробных данных всё-таки треубется работа с MySQL.
Ещё один недостаток такой статистики - при отключённых cookies
число посетителей онлайн может "накручиваться", увеличивая счётчик на 1 при каждом обновлении
страницы, сделанное в течение последних MAX_IDLE_TIME
минут.
Просто отключение cookies на стороне клиента может означать и отключение поддержки сессий в браузере
(при настройке session.use_cookies=1
в файле php.ini
, принятой по умолчанию). Однако
на сервере временный файл сессии будет создаваться при каждом обращении к странице и, соответственно,
будет считаться скриптом.
Если же отключить эту настройку программно:
ini_set('session.use_cookies', 0);
и выставить директиву
session.use_trans_sid=1
,
то браузер будет дописывать к каждой ссылке и каждой форме
идентификатор сессии, то есть,
<a href="/index.php">Index</a>
превратится в жуткое и не имеющее постоянного URL
<a href="/index.php?PHPSESSID=9ebca8bd62c830d3e79272b4f585ff8f">Index</a>
Поэтому будем предполагать, что куки включены, как оно обычно и есть :)
гостевая; E-mail |