Nickolay.info. 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>

Поэтому будем предполагать, что куки включены, как оно обычно и есть :)

P.S.Следует также понимать, что просмотр оглавления папки при каждой загрузке страницы, как делается в показанном примере, может создавать заметную "лишнюю" нагрузку на сервер.

Рейтинг@Mail.ru

вверх гостевая; E-mail