class Visitors
{
static function GetFileName() {
$tempName = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
return md5($tempName).'.txt';
}
public static function RemoveUserFile() {
// Путь до папки где лежат файлы посетителей
$visitorsDir = $_SERVER['DOCUMENT_ROOT'].'/local/online_count/';
$tmpName = self::GetFileName();
$tmpName = $visitorsDir.$tmpName;
unlink($tmpName);
}
public static function Count($isAuthorized = false) {
// Срок актуальности файла посетителя (в секундах)
$RelevanceOfTheFile = 60*5; // 5 минут
// Путь до папки где лежат файлы посетителей
$visitorsDir = $_SERVER['DOCUMENT_ROOT'].'/local/online_count/';
if (!file_exists($visitorsDir)) {
mkdir($visitorsDir, 0777, true);
}
// basic crawler detection and block script (no legit browser should match this)
if(!empty($_SERVER['HTTP_USER_AGENT']) and preg_match('~(bot|crawl)~i', $_SERVER['HTTP_USER_AGENT'])){
// this is a crawler and you should not count this
} else {
if(!$isAuthorized) {
// Сохраняем новый файл постетителя
$VisiterFileName = self::GetFileName();
$VisiterFileName = $visitorsDir.$VisiterFileName;
$OpenFile = fopen($VisiterFileName, "a+");
@fclose($OpenFile);
}
}
// Полный путь до всех файлов формата txt
$VisitersFiles = glob($visitorsDir.'*.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 {
unlink($file);
}
}
return $ActiveVisiters;
}
}
}
// При авторизации - удаляем файл "гостя"
AddEventHandler("main", "OnAfterUserAuthorize", Array("Visitors", "RemoveUserFile"));global $visitorsCount;
// Подсчитываем "гостей" сайта
$visitorsCount = Visitors::Count($USER->IsAuthorized());global $visitorsCount;
echo $visitorsCount;Если нужно показать количество последних активных пользователей (за 5 минут), или список (ограничение в 24 сейчас в коде) :
$filter = array(
"LAST_ACTIVITY" => 60*5, // 5 минут
"ACTIVE" => "Y",
);
$arParams = array(
"FIELDS" => array("ID", "NAME"),
);
$cntUsers = 0;
$maxUsersShow = 24;
$authUsers = [];
$rsUsers = CUser::GetList(($by="last_login"), ($order="desc"), $filter, $arParams); // выбираем пользователей
while($user = $rsUsers->Fetch()) {
if($cntUsers < $maxUsersShow) {
$authUsers[] = $user;
}
$cntUsers++;
}
// Количество активных пользователей
echo $cntUsers;
// Если нужен список последних активных пользователей (авторизованных)
foreach ($authUsers as $key => $user) {
echo $user['NAME'];
}