|
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>
Поэтому будем предполагать, что куки включены, как оно обычно и есть :)
|
|