-
Notifications
You must be signed in to change notification settings - Fork 0
/
ratelimiter.php
68 lines (64 loc) · 1.98 KB
/
ratelimiter.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
<?php
/**
* Rate Limiter
*
* This function check rate limiter, like X REQUESTS PER Y SECONDS
* IMPORTANT, ALLOW WRITE PERMISSION
*
* @param int $rate Requests
* @param int $per Per Seconds
* @param bool $only_verify Don't decresces allowance, only checks
* @param string $unique Unique name, when rate and per is equal but limiter is different
*
* @return bool TRUE -> IS ALLOWED, FALSE -> IS NOT ALLOWED
*
*/
function ratelimiter($rate = 10, $per = 1, $only_verify = false, $unique = ''){
/*FILE TO SAVE/LOAD LAST CHECK AND ALLOWANCE*/
$allowance_file = "request_allowance_{$unique}_{$rate}_{$per}.dat";
$lastcheck_file = "request_lastcheck_{$unique}_{$rate}_{$per}.dat";
if (file_exists($lastcheck_file)){
$last_check = file_get_contents($lastcheck_file);
}
else{
/*IF DOEST FILE EXISTS CREATE FILE - LAST CHECK WITH ACTUAL TIMESTAMP*/
$last_check = microtime(true);
file_put_contents($lastcheck_file, $last_check);
}
if (file_exists($allowance_file)){
$allowance = file_get_contents($allowance_file);
}
else{
/*IF DOEST FILE EXISTS CREATE FILE - RATE AS ALLOWANCE*/
$allowance = $rate;
file_put_contents($allowance_file, $rate);
}
$current = microtime(True);
$seconds_passed = $current - $last_check;
//echo "{$last_check}, {$seconds_passed}, {$allowance}<br>";
if ($seconds_passed > $per){
/* IF PASSED TIME IS BIGGER THAN $per SECONDS, "RESET" ALLOWANCE */
$allowance = $rate;
if (!$only_verify){
$allowance --;
file_put_contents($lastcheck_file, microtime(true));
}
file_put_contents($allowance_file, $allowance);
return true;
}
else{
if ($allowance > 0){
/*IF ALLOWANCE IS BIGGER THAN 0 (ZERO), AND $only_verify IS FALSE, THAN DECREASE ALLOWANCE*/
if (!$only_verify){
$allowance --;
file_put_contents($lastcheck_file, microtime(true));
}
file_put_contents($allowance_file, $allowance);
return true;
}
else{
$allowance = 0;
}
return false;
}
}