Наверное, путешествуя в Сети, вы не раз натыкались на подобного типа надпись «Сейчас на сайте 99 человек», что означает, что кроме вас в данный момент этот сайт просматривает 98 человек.
Скорее всего, вы хотели написать такую вещь, но не знали как.

Следующая статья покажет как самому написать скрипт, считающий количество посетителей на сайте в данный момент, то есть онлайн.

В Интернете много готовых скриптов, позволяющих считать пользователей онлайн, но раз вы читаете эту статью, значит, вы как и я не особо любите ковыряться в чужом коде. Ну, в таком, случае, давайте, напишем такой скрипт сами. Но прежде поговорим о его преимуществах и недостатках.

Преимущества

Ему не нужна реляционная база данных, что согласитесь, в нашем Рунете (я имею в виду относительно бесплатную его часть), является несомненным преимуществом.

Опять же несомненным преимуществом является скорость.
Я не поленился написать подобный скрипт с использованием БД и при помощи функции microtime() (в самом низу – результат ее работы – «Время генерации: …») измерил время выполнения:

Используя сессии – 0,7 мс

Используя БД – 14,2 мс

То есть преимущество в скорости – более чем в 19 раз! Вы можете сказать : «Тоже мне большое дело. Всего 13 мс разница», да они будут правы – а если посещаемость большая?
Растет нагрузка на сервер и тогда действительно такое преимущество становится очевидным.

Еще одно преимущество – то, что информация в сессиях хранится пока не закрыт браузер или 1440 секунд (стоит по умолчанию в php.ini), в БД информацию о юзерах вам пришлось бы удалять вручную.

И последнее – простота, чтобы объявить сессию достаточно вызвать функцию session_start(), а чтобы настроить правильных образом БД нужно написать целых 15 строк кода.

Недостатки

Нет детальной статистики – в сможете только узнать количество пользователей в данный момент, для ведения статистики (хиты, хосты…) придется все-таки работать с БД.

Нужен PHP4 – как это ни парадоксально – еще не все хостеры поставили себе PHP4.

Собственно скрипт:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php 
session_start(); 
define("MAX_IDLE_TIME", 3); 
function getOnlineUsers(){ 
if ( $directory_handle = opendir( session_save_path() ) ) { 
$count = 0; 
while ( false !== ( $file = readdir( $directory_handle ) ) ) { 
if($file != '.' && $file != '..'){ 
if(time()- filemtime(session_save_path() . '\' . $file) < MAX_IDLE_TIME * 60) { 
$count++; 
} 
} 
} 
closedir($directory_handle); 
return $count; 
} 
else { 
return false; 
}
} 
echo 'Пользователей онлайн: ' . getOnlineUsers() . '<br />'; ?>

ЗАМЕЧАНИЕ: Если у вас нет специальной директории для хранения сессий, просто сразу первой строчкой добавьте:

1
session_save_path("/path/to/custom/directory");

Теперь пройдемся по отдельным частям кода:

1
session_start();

Следующая строка кода — это объявление некоторой константы, в течении которой пользователи будет считаться активными, то есть присутствующими в данный момент на сайте.
В нашем примере — 180 секунд, то есть, если пользовательь не перешел на новую страницу или не перезагрузил эту в течении 3 минут, то он считается ушедшим с сайта и мы его уже не учитываем:

1
define("MAX_IDLE_TIME", 3);

Теперь мы объявляем функцию getonlineuser() и сразу открываем «сессионную» директорию:

1
function getOnlineUsers(){ if ( $directory_handle = opendir( session_save_path() ) ) {

Далее идет часть кода, которая собственно и отвечает за подсчет пользователей, функция возвращает кол-во пользователей онлайн:

1
2
3
4
5
6
7
8
9
10
11
12
13
$count = 0; while ( false !== ( $file = readdir( $directory_handle ) ) ) { 
if($file != '.' && $file != '..'){ 
if(time()- filemtime(session_save_path() . '' . $file) < MAX_IDLE_TIME * 60) { 
$count++; 
} 
} 
closedir($directory_handle); 
return $count; 
} 
else { 
return false; 
} 
}

И пожалуй, разумно будет вывод количества юзеров в конце:

1
echo 'Онлайн юзеров: ' . getOnlineUsers() . '<br />';

Все! Скрипт готов!