Tworzymy mechanizm, który pozwala sprawdzić, ilu realnie użytkowników jest na naszej stronie w przeciągu ostatnich 5 minut. Rozbudowa session helpera.
Zobaczmy na ostatnio napisaną metodę:
<?php
class Session
{
//(...)
public static function sessionsCount(){
$session_path = session_save_path();
$handle = opendir($session_path);
$sessions = 0;
while (($file = readdir($handle)) != FALSE) {
if(in_array($file, ['.', '..']))
continue;
if(!preg_match("/^sess/", $file))
continue;
$sessions++;
//$file_path = "{$session_path}/{$file}";
// echo $file_path . "<br>";
}
return $sessions;
}
public static function sessions5Minutes(){
$session_path = session_save_path();
$sessions = 0;
return $sessions;
}
}
Widzimy jak można podliczyć pliki sesyjne a nawet jak zdobyć ścieżkę do nich. Spróbujmy teraz coś takiego:
<?php
class Session
{
//(...)
public static function sessions5Minutes(){
$session_path = session_save_path();
$handle = opendir($session_path);
$sessions = 0;
while (($file = readdir($handle)) != FALSE) {
if(in_array($file, ['.', '..']))
continue;
if(!preg_match("/^sess/", $file))
continue;
$file_path = "{$session_path}/{$file}";
$last_access = date("Y-m-d H:i:s", fileatime($file_path));
echo $last_access;
echo "<br>";
}
return $sessions;
}
}
Session::start();
Session::sessions5Minutes();
//2024-05-28 14:20:04
//2024-05-29 17:03:52
//2024-07-02 12:45:14
//2024-07-02 12:45:17
Dla każdego pliku sesji mamy datę i czas ostatniego otwierania tego pliku. Teraz spróbujmy dostać datę i czas 5 minut temu:
<?php
class Session
{
//(...)
public static function sessions5Minutes(){
$session_path = session_save_path();
$handle = opendir($session_path);
$sessions = 0;
while (($file = readdir($handle)) != FALSE) {
if(in_array($file, ['.', '..']))
continue;
if(!preg_match("/^sess/", $file))
continue;
$file_path = "{$session_path}/{$file}";
$last_access = date("Y-m-d H:i:s", fileatime($file_path));
$now = date("Y-m-d H:i:s", strtotime("-5 minutes"));
echo "Last access: {$last_access}, now - 5 minutes: {$now}";
echo "<br>";
}
return $sessions;
}
}
Session::start();
Session::sessions5Minutes();
//Last access: 2024-05-28 14:20:04, now - 5 minutes: 2024-07-12 12:49:41
//Last access: 2024-05-29 17:03:52, now - 5 minutes: 2024-07-12 12:49:41
//Last access: 2024-07-02 12:45:14, now - 5 minutes: 2024-07-12 12:49:41
Teraz możemy porównać, czy ostatni dostęp miał miejsce 5 minut temu czy nie:
<?php
class Session
{
//(...)
public static function sessions5Minutes(){
$session_path = session_save_path();
$handle = opendir($session_path);
$sessions = 0;
while (($file = readdir($handle)) != FALSE) {
if(in_array($file, ['.', '..']))
continue;
if(!preg_match("/^sess/", $file))
continue;
$file_path = "{$session_path}/{$file}";
$last_access = date("Y-m-d H:i:s", fileatime($file_path));
$now = date("Y-m-d H:i:s", strtotime("-5 minutes"));
echo "Last access: {$last_access}, now - 5 minutes: {$now}";
echo "<br>";
var_dump($now <= $last_access);
echo "<br>";
}
return $sessions;
}
}
Session::start();
Session::sessions5Minutes();
// Last access: 2024-05-28 12:04:33, now - 5 minutes: 2024-07-12 12:52:14
// bool(false)
// Last access: 2024-07-12 12:57:14, now - 5 minutes: 2024-07-12 12:52:14
// bool(true)
Skoro widzimy, jak to działa i mamy dobry warunek, pora zwiększać pod tym warunkiem liczone sesje:
<?php
class Session
{
//(...)
public static function sessions5Minutes(){
$session_path = session_save_path();
$handle = opendir($session_path);
$sessions = 0;
while (($file = readdir($handle)) != FALSE) {
if(in_array($file, ['.', '..']))
continue;
if(!preg_match("/^sess/", $file))
continue;
$file_path = "{$session_path}/{$file}";
$last_access = date("Y-m-d H:i:s", fileatime($file_path));
$now = date("Y-m-d H:i:s", strtotime("-5 minutes"));
if($now <= $last_access)
$sessions++;
}
return $sessions;
}
}
Session::start();
echo Session::sessions5Minutes();
//1
To jeszcze nie koniec, rozbudowa funkcjonalności w następnej lekcji (na razie w pełni poprawnie działać nie będzie)…