Преимущества такого скрипта:
Несомненным преимуществом является скорость. Я не поленился написать подобный скрипт с использованием БД и при помощи функции microtime() (в самом низу – результат ее работы – «Время генерации: …») измерил время выполнения:
Используя сессии – 0,7 мс
Используя БД – 14,2 мс
То есть преимущество в скорости – более чем в 19 раз! Вы можете подумать: «еще чего большое дело. Всего 13 мс разница», а если посещаемость большая? Растет нагрузка на сервер и тогда действительно такое преимущество становится очевидным.
Еще одно преимущество – то, что информация в сессиях хранится пока не закрыт браузер или 1440 секунд (стоит по умолчанию в php.ini), в БД информацию о юзерах вам пришлось бы удалять вручную.
И последнее – простота, чтобы объявить сессию достаточно вызвать функцию session_start(), а чтобы настроить правильных образом БД нужно написать целых 15 строк кода.
Недостатки скрипта:
Нет детальной статистики – вы сможете только узнать количество пользователей в данный момент, для ведения статистики (хиты, хосты…) придется все-таки работать с БД.
Собственно сам скрипт:
- Код: Выделить всё • Развернуть
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()- fileatime(session_save_path() . '' . $file) < MAX_IDLE_TIME * 60) {
$count ;
}
} }
closedir($directory_handle);
return $count;
} else {
return false;
}}
echo 'Пользователей онлайн: ' . getOnlineUsers() . '
';
?>
ЗАМЕЧАНИЕ: Если у вас нет специальной директории для хранения сессий, просто сразу первой строчкой добавьте:
- Код: Выделить всё • Развернуть
session_save_path("/path/to/custom/directory");
Теперь пройдемся по отдельным частям кода:
- Код: Выделить всё • Развернуть
session_start();
Следующая строка кода - это объявление некоторой константы, в течении которой пользователи будет считаться активными, то есть присутствующими в данный момент на сайте. В нашем примере - 180 секунд, то есть, если пользователь не перешел на новую страницу или не перезагрузил эту в течении 3 минут, то он считается ушедшим с сайта и мы его уже не учитываем:
- Код: Выделить всё • Развернуть
define("MAX_IDLE_TIME", 3);
Теперь мы объявляем функцию getonlineuser() и сразу открываем "сессионную" директорию:
- Код: Выделить всё • Развернуть
function getOnlineUsers(){
if ( $directory_handle = opendir( session_save_path() ) ) {
Далее идет часть кода, которая собственно и отвечает за подсчет пользователей, функция возвращает кол-во пользователей онлайн:
- Код: Выделить всё • Развернуть
$count = 0;
while ( false !== ( $file = readdir( $directory_handle ) ) ) {
if($file != '.' && $file != '..'){
if(time()- fileatime(session_save_path() . '' . $file) < MAX_IDLE_TIME * 60) {
$count ;
}
}
closedir($directory_handle);
return $count;
} else {
return false;
}
}
И пожалуй, разумно будет вывод количества юзеров в конце:
- Код: Выделить всё • Развернуть
echo 'Онлайн юзеров: ' . getOnlineUsers() . '
';