This repository was archived by the owner on Jan 30, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathServerSideSegmentator.php
69 lines (59 loc) · 1.86 KB
/
ServerSideSegmentator.php
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
/**
* Created by REES46
* User: Michael Kechinov
* Date: 15/06/2017
* Time: 16:00
* Сегментатор хранит сегмент в $_SESSION
* Может быть несколько активных сегментов
* Сегментатор возвращает NULL вместо сегмента для поисковых ботов и пустых user-agent.
*/
class ServerSideSegmentator {
/**
* Префикс имени в сессии
*/
const PREFIX = 'r46_segment_';
/**
* Текущий сегмент
* @var string
*/
private $segment;
/**
* @param string $name Имя сесси
* @param int $count Количество сегментов
* @throws Exception
*/
public function __construct($name, $count) {
$segments = range('A', 'Z');
if( $count < 1 || $count > count($segments) ) {
throw new Exception('Incorrect segments count');
}
// Если сессия еще не запущена, запускаем
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
// Пропускаем ботов
if( !$this->isBot() ) {
// Генерируем сегмент, если его не было ранее
if( empty($_SESSION[self::PREFIX . $name]) || !in_array($_SESSION[self::PREFIX . $name], $segments) ) {
$this->segment = $segments[rand(1, $count) - 1];
$_SESSION[self::PREFIX . $name] = $this->segment;
} else {
$this->segment = $_SESSION[self::PREFIX . $name];
}
}
}
/**
* @return string|null
*/
public function getSegment() {
return $this->segment;
}
/**
* Проверяет ботов
* @return bool
*/
private function isBot() {
return empty($_SERVER['HTTP_USER_AGENT']) || preg_match('/YandexMetrika|Googlebot|bingbot|Screenshot Bot|YandexAntivirus|PEBOT|LWP::Simple|BBBike|wget|curl|msnbot|scrapbot|BLEXBot/', $_SERVER['HTTP_USER_AGENT']);
}
}