SearchQueries.php: extract garbage cleanup
This commit is contained in:
parent
d30ff6946a
commit
a50d47aa39
1 changed files with 24 additions and 11 deletions
|
@ -6,20 +6,25 @@ class SearchQueries {
|
||||||
private \PDO $pdo;
|
private \PDO $pdo;
|
||||||
private int $queries_per_minutes_single;
|
private int $queries_per_minutes_single;
|
||||||
private int $queries_per_minutes_all;
|
private int $queries_per_minutes_all;
|
||||||
|
private bool $auto_gc;
|
||||||
|
|
||||||
|
|
||||||
private function checkFloodImpl(string $ip, string $phrase): bool {
|
private function checkFloodImpl(string $ip, string $phrase): bool {
|
||||||
$now = time();
|
$now = \time();
|
||||||
|
$expiry_limit = \time() - ($this->queries_per_minutes_all * 60);
|
||||||
|
|
||||||
$query = $this->pdo->prepare("SELECT COUNT(*) FROM `search_queries` WHERE `ip` = :ip AND `time` > :time");
|
$query = $this->pdo->prepare("SELECT COUNT(*) FROM `search_queries` WHERE `ip` = :ip AND `time` > :time AND `time` <= :expiry_limit");
|
||||||
$query->bindValue(':ip', $ip);
|
$query->bindValue(':ip', $ip);
|
||||||
$query->bindValue(':time', $now - ($this->queries_per_minutes_single * 60));
|
$query->bindValue(':time', $now - ($this->queries_per_minutes_single * 60), \PDO::PARAM_INT);
|
||||||
|
$query->bindValue(':expiry_limit', $expiry_limit, \PDO::PARAM_INT);
|
||||||
$query->execute();
|
$query->execute();
|
||||||
if ($query->fetchColumn() > $this->queries_per_minutes_single) {
|
if ($query->fetchColumn() > $this->queries_per_minutes_single) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$query = $this->pdo->prepare("SELECT COUNT(*) FROM `search_queries` WHERE `time` > :time");
|
$query = $this->pdo->prepare("SELECT COUNT(*) FROM `search_queries` WHERE `time` > :time AND `time` <= :expiry_limit");
|
||||||
$query->bindValue(':time', $now - ($this->queries_per_minutes_all * 60));
|
$query->bindValue(':time', $now - ($this->queries_per_minutes_all * 60), \PDO::PARAM_INT);
|
||||||
|
$query->bindValue(':expiry_limit', $expiry_limit, \PDO::PARAM_INT);
|
||||||
$query->execute();
|
$query->execute();
|
||||||
if ($query->fetchColumn() > $this->queries_per_minutes_all) {
|
if ($query->fetchColumn() > $this->queries_per_minutes_all) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -27,22 +32,22 @@ class SearchQueries {
|
||||||
|
|
||||||
$query = $this->pdo->prepare("INSERT INTO `search_queries` VALUES (:ip, :time, :query)");
|
$query = $this->pdo->prepare("INSERT INTO `search_queries` VALUES (:ip, :time, :query)");
|
||||||
$query->bindValue(':ip', $ip);
|
$query->bindValue(':ip', $ip);
|
||||||
$query->bindValue(':time', $now);
|
$query->bindValue(':time', $now, \PDO::PARAM_INT);
|
||||||
$query->bindValue(':query', $phrase);
|
$query->bindValue(':query', $phrase);
|
||||||
$query->execute();
|
$query->execute();
|
||||||
|
|
||||||
// Cleanup search queries table
|
if ($this->auto_gc) {
|
||||||
$query = prepare("DELETE FROM `search_queries` WHERE `time` <= :time");
|
$this->purgeExpired();
|
||||||
$query->bindValue(':time', time() - ($this->queries_per_minutes_all * 60));
|
}
|
||||||
$query->execute();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function __construct(\PDO $pdo, int $queries_per_minutes_single, int $queries_per_minutes_all) {
|
public function __construct(\PDO $pdo, int $queries_per_minutes_single, int $queries_per_minutes_all, bool $auto_gc) {
|
||||||
$this->pdo = $pdo;
|
$this->pdo = $pdo;
|
||||||
$this->queries_per_minutes_single = $queries_per_minutes_single;
|
$this->queries_per_minutes_single = $queries_per_minutes_single;
|
||||||
$this->queries_per_minutes_all = $queries_per_minutes_all;
|
$this->queries_per_minutes_all = $queries_per_minutes_all;
|
||||||
|
$this->auto_gc = $auto_gc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -63,4 +68,12 @@ class SearchQueries {
|
||||||
throw $e;
|
throw $e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function purgeExpired(): int {
|
||||||
|
// Cleanup search queries table.
|
||||||
|
$query = prepare("DELETE FROM `search_queries` WHERE `time` <= :expiry_limit");
|
||||||
|
$query->bindValue(':expiry_limit', \time() - ($this->queries_per_minutes_all * 60), \PDO::PARAM_INT);
|
||||||
|
$query->execute();
|
||||||
|
return $query->rowCount();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue