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)…