Comment modifier le délai de session en PHP?

je voudrais prolonger le délai de session en php

je sais qu'il est possible de le faire en modifiant le php.fichier ini. Mais je n'ai pas accès à elle.

est-il donc possible de le faire uniquement avec du code php?

125
demandé sur Jon 2011-11-29 17:13:41

6 réponses

Session timeout est une notion qui doit être implémentée en code si vous voulez des garanties strictes; c'est la seule façon vous pouvez être absolument certain qu'aucune session ne survivra jamais après X minutes d'inactivité.

si assouplir un peu cette exigence est acceptable et vous êtes d'accord pour placer une limite inférieure au lieu d'une limite stricte à la durée, vous pouvez le faire facilement et sans écrire la logique personnalisée.

Confort dans une atmosphère détendue environnements: comment et pourquoi

si vos sessions sont implémentées avec des cookies (ce qu'ils sont probablement), et si les clients ne sont pas malveillants, vous pouvez définir une limite supérieure sur la durée de la session en modifiant certains paramètres. Si vous utilisez la gestion de session par défaut de PHP avec des cookies, paramétrage session.gc_maxlifetime avec session_set_cookie_params devrait fonctionner pour vous comme ceci:

// 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!

cela fonctionne en configurant le serveur pour garder les données de session autour pendant au moins une heure d'inactivité et en instruisant vos clients qu'ils devraient" oublier " leur id de session après la même période. ces Deux étapes sont nécessaires pour atteindre le résultat attendu.

  • si vous ne dites pas aux clients d'oublier leur ID de session après une heure (ou si les clients sont malveillants et choisissent d'ignorer vos instructions) ils continueront à utiliser le même id de session et sa durée effective sera non-déterministe. Cela est dû au fait que les sessions dont la durée de vie a expiré du côté du serveur ne sont pas immédiatement récupérées, mais seulement chaque fois que la session GC démarre dans .

    GC est un processus potentiellement coûteux, donc typiquement la probabilité est plutôt faible ou même zéro (un site web qui reçoit un grand nombre de visites renoncera probablement entièrement à la GC probabiliste et planifiera qu'elle se produise en arrière-plan toutes les X minutes). Dans les deux cas (en supposant que les clients ne coopèrent pas), la limite inférieure pour des durées de vie de session efficaces sera session.gc_maxlifetime , mais la limite supérieure sera imprévisible.

  • si vous ne définissez pas session.gc_maxlifetime au même intervalle de temps, alors le serveur peut rejeter des données de session inactives plus tôt que cela; dans ce cas, un client qui se souvient encore de son id de session le présentera mais le serveur ne trouvera aucune donnée associée à cette session, se comportant effectivement comme si la session venait de commencer.

certitude dans les environnements critiques

vous pouvez rendre les choses complètement contrôlable en utilisant la logique personnalisée pour également placer une limite supérieure sur l'inactivité de session; avec la limite inférieure de ce résultats dans un cadre strict.

faites ceci en sauvegardant la limite supérieure avec le reste des données de session:

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;
"1519150920 id de Session" persistance

jusqu'à présent nous n'avons pas du tout été concernés par les valeurs exactes de chaque ID de session, seulement avec l'exigence que les données doivent exister aussi longtemps que nous en avons besoin. Soyez conscient que dans le cas (peu probable) que les ID de session comptent pour vous, il faut prendre soin de régénérer avec session_regenerate_id si nécessaire.

267
répondu Jon 2015-05-11 10:04:46

si vous utilisez la gestion de session par défaut de PHP, la seule façon de changer de manière fiable la durée de la session sur toutes les plateformes est de changer php.ini . C'est parce que sur certaines plateformes, la collecte des déchets est implémentée par un script qui tourne à chaque fois (un script cron ) qui lit directement à partir de php.151910920", ne sont pas fiables et la plupart des probablement ne fonctionnera pas.

par exemple, dans les systèmes Debian Linux, la collecte des ordures se fait via /etc/cron.d / php5 qui court à XX: 09 ET XX: 39 (c'est-à-dire toutes les demi-heures), et s'il trouve une session plus ancienne que la session .gc_maxlifetime spécifié dans php.ini , puis cette session est supprimée sans pitié. Cela explique aussi pourquoi dans cette question: sessions PHP chronométrage trop rapidement , L'OP avait des problèmes dans un hôte, mais les problèmes ont cessé lors du passage à un autre hôte.

donc, étant donné que vous n'avez pas accès à php.ini , si vous voulez le faire de manière fiable, l'utilisation de la gestion de session par défaut n'est pas une option. Apparemment, prolonger la durée de vie des cookies était suffisant pour votre hôte, mais si vous voulez une solution qui fonctionne de manière fiable même si vous changez d'hôte, vous devez utiliser une alternative différente.

disponible les autres méthodes comprennent:

  1. définir un gestionnaire de session différent (enregistrer) en PHP pour enregistrer vos sessions dans un répertoire différent ou dans une base de données, comme spécifié dans PHP: Gestionnaire de Session personnalisé (manuel PHP) , de sorte que le cron travail ne l'atteint pas, et seule la collecte des ordures internes de PHP a lieu. Cette option peut probablement utiliser ini_set() pour définir session.gc_maxlifetime mais je préfère ignorer le paramètre maxlifetime dans mon gc() callback et déterminer la durée de vie maximale sur mon propre.

  2. oubliez complètement la gestion de session interne de PHP et mettez en œuvre votre propre gestion de session. Cette méthode a deux inconvénients principaux: vous aurez besoin de vos propres variables de session globales, de sorte que vous perdez l'avantage de la $_SESSION superglobal, et il a besoin de plus de code ainsi il y a plus d'opportunités pour les bogues et les failles de sécurité. Plus important encore, l'identifiant de session doit être généré à partir de nombres aléatoires ou pseudorandom cryptographiquement sécurisés pour éviter la prévisibilité de l'ID de session (conduisant à un possible détournement de session), et ce n'est pas si facile à faire avec PHP de manière fiable. Le principal avantage est qu'il fonctionne de manière cohérente sur toutes les plateformes et que vous avez le contrôle total sur le code. C'est l'approche adoptée par exemple par le forum phpBB logiciel (au moins la version 1; Je ne suis pas sûr des versions plus récentes).

il y a un exemple de (1) dans la documentation pour session_set_save_handler() . L'exemple est long mais je vais le reproduire ici, avec les modifications nécessaires pour prolonger la durée de la session. Notez l'inclusion de session_set_cookie_params() pour augmenter la durée de vie du cookie ainsi.

<?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
L'approche

(2) est plus compliquée; fondamentalement, vous devez ré-implémenter toutes les fonctions de session sur votre propre. Je n'entrerai pas dans les détails ici.

25
répondu Pedro Gimeno 2017-11-23 10:02:01

ajout de commentaire pour toute personne utilisant Plesk ayant des problèmes avec l'un des ci-dessus car il me rendait fou, session de réglage.gc_maxlifetime à partir de votre script PHP ne fonctionnera pas car Plesk dispose de son propre script de collecte des ordures depuis cron.

j'ai utilisé la solution affichée sur le lien ci-dessous de déplacer l'emploi cron de l'heure au jour pour éviter ce problème, alors la réponse supérieure ci-dessus devrait fonctionner:

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

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

2
répondu Neil Walden 2018-06-21 09:40:30

mettez $_SESSION['login_time'] = time(); dans la page d'authentification précédente. Et le snipped ci-dessous dans toutes les autres pages où vous voulez vérifier la session time-out.

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
répondu mohamadRezaSamadi 2017-10-15 10:06:40

Pas de. Si vous n'avez pas accès au php.ini, vous ne pouvez pas garantir que les changements auront un effet.

je doute que vous ayez besoin de prolonger vos sessions.

Il a un temps d'arrêt assez raisonnable pour le moment et il n'y a aucune raison de le prolonger.

0
répondu Your Common Sense 2011-11-29 13:16:17

vous pouvez outrepasser les valeurs en php.ini à partir de votre code PHP en utilisant ini_set() .

0
répondu Nathan Q 2011-11-29 14:16:29