Web

Как завершить сеанс PHP через 30 минут?

Мне нужно поддерживать сеанс в течение 30 минут, а затем завершить его.

 

Ответ 1

Вы должны реализовать собственный тайм-аут сеанса. Такие варианты, как (session.gc_maxlifetime и session.cookie_lifetime), ненадежны. Я объясню причины этого.

 

Первое:

session.gc_maxlifetime
session.gc_maxlifetime указывает количество секунд, по истечении которых данные будут рассматриваться как «мусор» и очищены. Сборка мусора происходит во время запуска сеанса.

Но сборщик мусора запускается только с вероятностью session.gc_probability, деленной на session.gc_divisor. А при использовании значений по умолчанию для этих параметров (1 и 100 соответственно) вероятность составляет всего 1%.

Вы можете просто настроить эти значения, чтобы сборщик мусора запускался чаще. Но когда сборщик мусора запускается, он проверяет правильность каждого зарегистрированного сеанса. И это требует больших затрат.

Кроме того, при использовании файлов PHP по умолчанию session.save_handler данные сеанса хранятся в файлах по пути, указанному в session.save_path. С этим обработчиком сеанса возраст данных сеанса рассчитывается на дату последнего изменения файла, а не на дату последнего доступа.

Примечание. Если вы используете файловый обработчик сеанса по умолчанию, ваша файловая система должна отслеживать время доступа (atime). В Windows FAT это не работает, поэтому вам придется придумать другой способ обработки сборки мусора для вашего сеанса, если вы используете файловую систему FAT или похожую, где отслеживание времени недоступно. Начиная с PHP 4.2.3, вместо atime используется mtime (дата изменения). Таким образом, у вас не будет проблем с файловыми системами, для которых недоступно отслеживание времени.

Также может произойти, что файл данных сеанса будет удален, в то время как сам сеанс по-прежнему считается действительным, поскольку данные сеанса не обновлялись.

 

Второе:

session.cookie_lifetime
session.cookie_lifetime определяет время жизни файла cookie в секундах, который отправляется в браузер. 

Это влияет только на время жизни cookie, и сам сеанс может оставаться действительным. Но задача сделать сессию недействительной - это задача сервера, а не клиента. Так что это не помогает. Фактически, если для параметра session.cookie_lifetime установлено значение 0, файл cookie сеанса станет файлом сеанса cookie, который действителен только до закрытия браузера.

 

В заключение:

Лучшее решение - установить собственный тайм-аут сеанса. Используйте простую метку времени, которая обозначает время последнего действия (т. е. запроса), и обновляйте ее при каждом запросе:

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {

    // последний запрос был сделан более 30 минут назад

    session_unset();     // unset $_SESSION

    session_destroy();   // уничтожение данных сессии

}

$_SESSION['LAST_ACTIVITY'] = time(); // обновление временной метки последней активности

 

Обновление данных сеанса с каждым запросом также изменяет дату изменения файла сеанса, так что сеанс не удаляется сборщиком мусора преждевременно.

Вы также можете использовать дополнительную метку времени для периодического восстановления идентификатора сеанса, чтобы избежать атак на сеансы:

if (!isset($_SESSION['CREATED'])) {

    $_SESSION['CREATED'] = time();

} else if (time() - $_SESSION['CREATED'] > 1800) {

    // сеанс начался более 30 минут назад

    session_regenerate_id(true);    // изменить идентификатор для текущей сессии и аннулировать старый идентификатор сессии

    $_SESSION['CREATED'] = time();  // обновить время создания

}

 

На заметку:

  • session.gc_maxlifetime должен быть как минимум равным времени жизни этого настраиваемого обработчика истечения срока действия (1800 в этом примере);

  • если вы хотите завершить сеанс через 30 минут активности, а не через 30 минут с момента запуска, вам также необходимо использовать setcookie с истечением срока действия, time() + 60 * 30, чтобы сохранить активным cookie сеанса.

 

Ответ 2

Простой способ завершения сеанса PHP за 30 минут.

Примечание: если вы хотите изменить время, просто замените 30 на желаемое время.

В минутах: (30 * 60)
В днях: (n * 24 * 60 * 60) n = количество дней

 

Login.php

<?php

    session_start();

?>

 

<html>

    <form name="form1" method="post">

        <table>

            <tr>

                <td>Логин</td>

                <td><input type="text" name="text"></td>

            </tr>

            <tr>

                <td>Пароль</td>

                <td><input type="password" name="pwd"></td>

            </tr>

            <tr>

                <td><input type="submit" value="SignIn" name="submit"></td>

            </tr>

        </table>

    </form>

</html>

 

<?php

    if (isset($_POST['submit'])) {

        $v1 = "FirstUser";

        $v2 = "MyPassword";

        $v3 = $_POST['text'];

        $v4 = $_POST['pwd'];

        if ($v1 == $v3 && $v2 == $v4) {

            $_SESSION['luser']  = $v1;

            $_SESSION['start']  = time();

            $_SESSION['expire'] = $_SESSION['start'] + (30 * 60);

            header('Location: http://localhost/somefolder/homepage.php');

        } else {

            echo "Пожалуйста, введите имя пользователя или пароль еще раз!";

        }

    }

?>

 

HomePage.php

<?php

    session_start();

    if (!isset($_SESSION['luser'])) {

        echo "Please Login again";

        echo "<a href='http://localhost/somefolder/login.php'>Кликни здесь для входа</a>";

    }

    else {

        $now = time();

        if ($now > $_SESSION['expire']) {

            session_destroy();

            echo "Твоя сессия завершена!<a href='http://localhost/somefolder/login.php'>Логин</a>";

        } else {?>

            <html>

                Добро пожаловать!

                <?php

                    echo $_SESSION['luser'];

                    echo "<a href='http://localhost/somefolder/logout.php'>Выход</a>";

                ?>

            </html>

<?php

        }

    }

?>

 

LogOut.php

<?php

    session_start();

    session_destroy();

    header('Location: http://localhost/somefolder/login.php');

?>

Схожие статьи

Web

Как сделать так, чтобы все значения PHP echo попадали в таблицу HTML

Что такое локальное хранилище и как его используют в программировании
Web

Что такое локальное хранилище и как его используют в программировании

Web

Как определить, пуста ли переменная bash?

Блокировка сайта Роскомнадзором: какие основания могут быть
Web

Блокировка сайта Роскомнадзором: какие основания могут быть

×