Создание сайтов на 1С-Битрикс

Подсчитать количество посетителей за 5 минут

С проверкой на добросовестных ботов

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'];
}


Логотип SiteBERG
Изменено: 01.11.2025 12:53

Статьи

Что нужно сделать?