Недавно получил небольшое задание от знакомого программиста, сделать функцию для его сайта которая бы показывала сколько посетителей сейчас на сайта, что интересно не использовать базу данных и как можно компактнее сделать функцию. Я решил использовать ради этого, обыкновенные текстовыми файлами которые не будут содержать ничего, следовательно не будут занимать место.
Логика скрипта:
1. Посетитель входит на сайт, если он новый то создается txt файл с его данными. Если же он недавний посетитель, то обновляем только последнею дату модификации его файла.
2. Скрипт получает данные с полным путем всех текстовых файлов в массив. Проверяем когда были сделаны последние модификации в текстовом файле.
3. Если сума последней модификации в текстовом файле( в unix секундах ) + указанный нами срок актуальности файла в секундах, является меньше текущего времени в секундах значит пользователь покинул сайт или не обновил страницу в браузере.
Плюсы скрипта:
- Компактная функция с ясно прокомментированным кодом и логично названными переменными.
- Два вида счета посетителей: 1 - Учитывать только IP. 2 - Учитывать IP и браузер
- Независим от базы данных
- Не требует никаких конфигурации со стороны PHP, требует только права 777 на папку с файлами.
Минусы скрипта:
- Может возникнуть ошибка Permission denied если папка с текстовыми файлами не имеет права 777. Но, это скорее ошибка со стороны пользователя а не скрипта.
- Он не показывает текущие кол-во людей на сайте, он показывает сколько посетителей зашли на сайт за указанный вами интервал времени.
- Любой скрипт можно написать бы лучше, сколько программистов столько и стилей программирования.
Посмотрим код нашей функции
Не забудьте дать папки online_count права 777
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<?php function onlineCount() { // Срок актуальности файла посетителя (в секундах) $RelevanceOfTheFile = 60; // Путь до папки где лежат файлы посетителей $VisistersFileDir = $_SERVER['DOCUMENT_ROOT'].'/online_count/'; // Учитывать в названии файла и браузер 1 - да, 0 - нет $AddBrowserAtFileName = 0; // Сохраняем новый файл постетителя $VisiterFileName = $_SERVER['REMOTE_ADDR']; if($AddBrowserAtFileName) { $VisiterFileName .= $_SERVER['HTTP_USER_AGENT']; } $VisiterFileName = $VisistersFileDir.md5($VisiterFileName).'.txt'; $OpenFile = fopen($VisiterFileName, "a+"); // Полный путь до всех файлов формата txt $VisitersFiles = glob($VisistersFileDir.'*.txt'); // Проверяем кол-во посетителей за последние $RelevanceOfTheFile секунд if(!count($VisitersFiles)) { return 0; } else { $ActiveVisiters = 0; foreach($VisitersFiles as $File) { $AgeFile = filemtime($File); if( ($AgeFile + $RelevanceOfTheFile) >= time() ) { $ActiveVisiters += 1; $UpdateTheDateOfLastEdit = fopen($File, 'a+'); @fclose($UpdateTheDateOfLastEdit); } else { @fclose($OpenFile); $DeleteOldFile = unlink($File); } } return $ActiveVisiters; } } $OnlineCount = onlineCount(); echo "Посетителей на сайт за последнюю минуту: ".$OnlineCount; ?> |
Результат работы скрипта:
1 |
Посетителей на сайт за последнюю минуту: 1 |
Скачать архив с примером
Все вопросы пишем в комментариях.