Jak zmienić limit czasu sesji w PHP?

Chciałbym wydłużyć czas sesji w php

Wiem, że można to zrobić modyfikując php.plik ini. Ale nie mam do niego dostępu.

Więc czy można to zrobić tylko z kodem php?

Author: Jon, 2011-11-29

6 answers

Session timeout to pojęcie, które musi być zaimplementowane w kodzie, jeśli chcesz mieć ścisłe Gwarancje; to jedyny sposób możesz być absolutnie pewien, że żadna sesja nie przetrwa po X minutach nieaktywności.

Jeśli złagodzenie tego wymogu jest dopuszczalne i nie masz nic przeciwko wprowadzeniu dolnej granicy zamiast ścisłego limitu czasu trwania, możesz to zrobić łatwo i bez pisania niestandardowej logiki.

[[15]}wygoda w relaksującym otoczeniu: jak i dlaczego

Jeśli Twoje sesje są zaimplementowane za pomocą Plików cookie (które prawdopodobnie są), a Jeśli klienci nie są złośliwi, możesz ustawić górną granicę czasu trwania sesji, poprawiając niektóre parametry. Jeśli używasz domyślnej obsługi sesji PHP za pomocą Plików cookie, ustawienie session.gc_maxlifetime wraz z session_set_cookie_params powinno działać tak:

// server should keep session data for AT LEAST 1 hour
ini_set('session.gc_maxlifetime', 3600);

// each client should remember their session id for EXACTLY 1 hour
session_set_cookie_params(3600);

session_start(); // ready to go!

Działa to poprzez skonfigurowanie serwera tak, aby dane sesji były przechowywane przez co najmniej jedną godzinę brak aktywności i instruowanie klientów, że powinni "zapomnieć" o identyfikatorze sesji po tym samym czasie. oba te kroki są wymagane do osiągnięcia oczekiwanego rezultatu.

  • Jeśli nie każesz klientom zapomnieć identyfikatora sesji po godzinie (lub jeśli klienci są złośliwi i zignorują twoje instrukcje), będą nadal używać tego samego identyfikatora sesji, a jego efektywny czas trwania nie będzie deterministyczny. To dlatego, że sesje, których życie ma wygasłe po stronie serwera nie są zbierane od razu, ale tylko za każdym razem, gdy rozpoczyna się sesja GC .

    GC jest potencjalnie kosztownym procesem, więc zazwyczaj prawdopodobieństwo jest raczej małe lub nawet zerowe (strona uzyskująca ogromną liczbę trafień prawdopodobnie całkowicie zrezygnuje z probabilistycznego GC i zaplanuje, że stanie się to w tle co X minut). W obu przypadkach (przy założeniu klientów niewspółpracujących) dolna granica efektywnego okresu trwania sesji będzie session.gc_maxlifetime, ale górna granica będzie nieprzewidywalna.

  • Jeśli nie ustawisz session.gc_maxlifetime na ten sam zakres czasu, serwer może odrzucić bezczynne dane sesji wcześniej niż wcześniej; w tym przypadku klient, który nadal pamięta swój identyfikator sesji, zaprezentuje go, ale serwer nie znajdzie żadnych danych powiązanych z tą sesją, zachowując się tak, jakby sesja dopiero się rozpoczęła.

Pewność w krytycznych środowiskach

Możesz całkowicie kontrolować rzeczy za pomocą niestandardowa logika, aby również umieścić górną granicę przy nieaktywności sesji; wraz z dolną granicą od góry skutkuje to ścisłym ustawieniem.

Zrób to, zapisując górną granicę wraz z resztą danych sesji:

session_start(); // ready to go!

$now = time();
if (isset($_SESSION['discard_after']) && $now > $_SESSION['discard_after']) {
    // this session has worn out its welcome; kill it and start a brand new one
    session_unset();
    session_destroy();
    session_start();
}

// either new or old, it should live at most for another hour
$_SESSION['discard_after'] = $now + 3600;

Session id persistence

Do tej pory nie byliśmy w ogóle zainteresowani dokładnymi wartościami każdego identyfikatora sesji, tylko wymogiem, że dane powinny istnieć tak długo, jak tego potrzebujemy. Należy pamiętać, że w (mało prawdopodobnym) przypadku te identyfikatory sesji mają dla Ciebie znaczenie, należy zadbać o ich regenerację za pomocą session_regenerate_id, gdy jest to wymagane.

 267
Author: Jon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-11 10:04:46

Jeśli używasz domyślnej obsługi sesji PHP, jedynym sposobem na niezawodną zmianę czasu trwania sesji na wszystkich platformach jest zmiana php.ini . Dzieje się tak dlatego, że na niektórych platformach zbieranie śmieci jest realizowane za pomocą skryptu, który działa co pewien czas (skrypt cron), który odczytuje bezpośrednio z php.ini , a zatem wszelkie próby jej zmiany w czasie wykonywania, np. via ini_set(), są zawodne i najprawdopodobniej nie zadziałają.

Na przykład w Debianie Linux systemy, usuwanie śmieci odbywa się poprzez /etc / cron.d / php5, który działa w XX: 09 i XX: 39 (czyli co pół godziny), i jeśli znajdzie sesję starszą niż sesja .gc_maxlifetime określone w php.ini , wtedy ta sesja zostaje usunięta bez litości. To również wyjaśnia, dlaczego w tym pytaniu: sesje PHP zbyt szybko się wyłączają , OP miał problemy w jednym Hostie, ale problemy ustały po przejściu na inny host.

Więc, biorąc pod uwagę, że nie masz dostępu do php.ini , Jeśli chcesz to zrobić przenośnie, używanie domyślnej obsługi sesji nie jest opcją. Najwyraźniej wydłużenie okresu użytkowania plików cookie wystarczyło hostowi, ale jeśli chcesz znaleźć rozwiązanie, które działa niezawodnie, nawet jeśli zmienisz hosty, musisz użyć innej alternatywy.

Dostępne metody alternatywne obejmują:

  1. Ustaw inną obsługę sesji (Zapisz) w PHP, aby zapisać sesje w innym katalogu lub w bazie danych, jak określono w PHP: Custom Session Handlers (PHP manual) , dzięki czemu zadanie cron nie dociera do niego i odbywa się tylko wewnętrzne usuwanie śmieci PHP. Opcja ta prawdopodobnie może wykorzystać ini_set() do Ustawienia sesji .gc_maxlifetime ale wolę po prostu zignorować parametr maxlifetime w moim wywołaniu zwrotnym gc() i określić maksymalny czas życia na własną rękę.

  2. Całkowicie zapomnij o wewnętrznej obsłudze sesji PHP i zaimplementuj własne zarządzanie sesjami. To metoda ma dwie główne wady: będziesz potrzebował własnych zmiennych sesji globalnej, więc stracisz przewagę superglobalu $_SESSION i potrzebuje więcej kodu, więc jest więcej możliwości błędów i wad bezpieczeństwa. Co najważniejsze, identyfikator sesji powinien być generowany z bezpiecznych kryptograficznie liczb losowych lub pseudorandomowych, aby uniknąć przewidywalności ID sesji( co prowadzi do ewentualnego przejęcia sesji), a to nie jest tak łatwe do zrobienia z PHP przenośnie. Główną zaletą jest to, że będzie działać konsekwentnie na wszystkich platformach i masz pełną kontrolę nad kodem. Takie podejście przyjmuje np. oprogramowanie forum phpBB (przynajmniej Wersja 1; nie jestem pewien co do nowszych wersji).

Jest przykład (1) w dokumentacji dla session_set_save_handler(). Przykład jest długi, ale odtworzę go tutaj, z odpowiednimi modyfikacjami niezbędnymi do przedłużenia czasu trwania sesji. Zwróć uwagę na włączenie session_set_cookie_params(), aby wydłużyć żywotność plików cookie jako cóż.

<?php
class FileSessionHandler
{

    private $savePath;
    private $lifetime;

    function open($savePath, $sessionName)
    {
        $this->savePath = 'my_savepath'; // Ignore savepath and use our own to keep it safe from automatic GC
        $this->lifetime = 3600; // 1 hour minimum session duration
        if (!is_dir($this->savePath)) {
            mkdir($this->savePath, 0777);
        }

        return true;
    }

    function close()
    {
        return true;
    }

    function read($id)
    {
        return (string)@file_get_contents("$this->savePath/sess_$id");
    }

    function write($id, $data)
    {
        return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
    }

    function destroy($id)
    {
        $file = "$this->savePath/sess_$id";
        if (file_exists($file)) {
            unlink($file);
        }

        return true;
    }

    function gc($maxlifetime)
    {
        foreach (glob("$this->savePath/sess_*") as $file) {
            if (filemtime($file) + $this->lifetime < time() && file_exists($file)) { // Use our own lifetime
                unlink($file);
            }
        }

        return true;
    }
}

$handler = new FileSessionHandler();
session_set_save_handler(
    array($handler, 'open'),
    array($handler, 'close'),
    array($handler, 'read'),
    array($handler, 'write'),
    array($handler, 'destroy'),
    array($handler, 'gc')
    );

// the following prevents unexpected effects when using objects as save handlers
register_shutdown_function('session_write_close');

session_set_cookie_params(3600); // Set session cookie duration to 1 hour
session_start();
// proceed to set and retrieve values by key from $_SESSION

Podejście (2) jest bardziej skomplikowane; zasadniczo musisz samodzielnie zaimplementować wszystkie funkcje sesji. Nie będę tu wchodzić w szczegóły.

 25
Author: Pedro Gimeno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-23 10:02:01

Dodawanie komentarza dla każdego, kto używa Plesk, ma problemy z którymkolwiek z powyższych, ponieważ doprowadzało mnie to do szaleństwa, ustawiając sesję.gc_maxlifetime ze skryptu PHP nie będzie działać, ponieważ Plesk ma własny skrypt do zbierania śmieci uruchamiany z cron.

Użyłem rozwiązania zamieszczonego na poniższym linku przenoszenia Zadania cron z godzinowego na dzienny, aby uniknąć tego problemu, wtedy górna odpowiedź powyżej powinna działać:

mv /etc/cron.hourly/plesk-php-cleanuper /etc/cron.daily/

Https://websavers.ca/plesk-php-sessions-timing-earlier-expected

 2
Author: Neil Walden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-21 09:40:30

Umieść $_SESSION['login_time'] = time(); na poprzedniej stronie uwierzytelniania. A poniższy fragment na każdej innej stronie, na której chcesz sprawdzić czas sesji.

if(time() - $_SESSION['login_time'] >= 1800){        
    header("Location: logout.php");
    //redirect if the page is inactive for 30 minutes
}
else {        
   $_SESSION['login_time'] = time();
   // update value of session
}
 1
Author: mohamadRezaSamadi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-15 10:06:40

Nie. Jeśli nie masz dostępu do php.ini, nie możesz zagwarantować, że zmiany przyniosą jakikolwiek efekt.

Wątpię, że musisz wydłużyć czas sesji.
W tej chwili ma dość rozsądny czas i nie ma powodów, aby go przedłużyć.

 0
Author: Your Common Sense,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-29 13:16:17

Możesz nadpisać wartości w php.ini z twojego kodu PHP używając ini_set().

 0
Author: Nathan Q,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-29 14:16:29