Maison >développement back-end >Problème PHP >Comment définir le délai d'expiration en php

Comment définir le délai d'expiration en php

藏色散人
藏色散人original
2020-11-04 11:38:553757parcourir

Comment définir le délai d'expiration en PHP : définissez d'abord la session et lisez la session ; puis effacez la session via "unset($_SESSION[$name]);" et enfin affichez "session::get( 'test') ;" a expiré.

Comment définir le délai d'expiration en php

Recommandé : "Tutoriel vidéo PHP"

Définissez strictement l'heure d'expiration de la session en php !

Limitez strictement l'expiration de la session après 30 minutes !

1. Définissez la durée de vie du cookie client à 30 minutes

2. Définissez la durée de vie maximale de la session

3. Ajoutez un horodatage, puis portez un jugement lorsque le programme est appelé ;

Pour savoir pourquoi, comprenons d'abord les principes de base de la session en PHP :

La période de validité de session par défaut en PHP est 1440 secondes (24 minutes), c'est-à-dire que si le client ne s'actualise pas pendant plus de 24 minutes, la session en cours deviendra invalide. Bien entendu, si l'utilisateur ferme le navigateur, la session se terminera et la Session n'existera naturellement plus !

Comme nous le savons tous, la session est stockée côté serveur. Le fichier de l'utilisateur est obtenu en fonction du SessionID fourni par le client, puis le fichier est lu pour obtenir la valeur de la variable. peut utiliser le Cookie du client ou le protocole Http1.1

Query_String (la partie après le "?" de l'URL accédée) est envoyée au serveur, puis le serveur lit le répertoire de session...

Pour contrôler le cycle de vie de la Session, nous devons d'abord connaître les paramètres pertinents de php.ini sur la Session (ouvrez le fichier php.ini, dans la section "[Session]") :

1. session.use_cookies : La valeur par défaut est "1", ce qui signifie que SessionID utilise des cookies, sinon utilisez Query_String pour transmettre

2. dans SessionID, qui peut être Cookie ou Query_String. La valeur par défaut est "PHPSESSID" ;

3. session.cookie_lifetime : Cela représente l'heure à laquelle le SessionID est stocké dans le cookie client. que le SessionID sera invalidé dès que le navigateur le fermera... C'est pour cette raison que la Session ne peut pas être utilisée en permanence !

4. session.gc_maxlifetime : C'est l'heure à laquelle les données de session sont stockées côté serveur. Si cette durée est dépassée, les données de session seront automatiquement supprimées !

Il existe de nombreux autres paramètres, mais ce sont ceux liés à cet article. Commençons par comment définir le cycle de survie de la session.

Comme mentionné précédemment, le serveur lit les données de session via SessionID, mais généralement l'ID de session envoyé par le navigateur disparaît après la fermeture du navigateur, il nous suffit donc de définir manuellement l'ID de session et de l'enregistrer, n'est-ce pas Oui...

Si vous disposez des autorisations de fonctionnement du serveur, alors le paramétrage est très, très simple. Il vous suffit d'effectuer les étapes suivantes :

1. session.use_cookies" sur 1, utilisez Cookie pour stocker l'ID de session, mais la valeur par défaut est 1, généralement pas besoin de modifier ;

2. Remplacez "session.cookie_lifetime" par l'heure que vous devez définir (par exemple, une heure, vous pouvez le régler sur 3600, en secondes Unit);

3. Réglez "session.gc_maxlifetime" à la même heure que "session.cookie_lifetime"

C'est clairement indiqué; dans la documentation PHP que les paramètres permettant de définir la période de validité de la session sont session.gc_maxlifetime. Ce paramètre peut être modifié dans le fichier php.ini ou via la fonction ini_set(). Le problème est qu'après de nombreux tests, la modification de ce paramètre

n'a pratiquement aucun effet, et la durée de validité de la session conserve toujours la valeur par défaut de 24 minutes.

En raison du mécanisme de fonctionnement de PHP, il ne dispose pas de thread démon pour analyser régulièrement les informations de session et déterminer si elles sont invalides. Lorsqu'une requête valide se produit, PHP décidera de démarrer ou non un GC (Garbage Collector).

Par défaut, session.gc_probability = 1, session.gc_divisor = 100, ce qui signifie qu'il y a une probabilité de 1 % que GC soit démarré. Le travail du GC consiste à analyser toutes les informations de session, à soustraire l'heure de la dernière modification (date de modification) de la session de l'heure actuelle et à la comparer avec le paramètre session.gc_maxlifetime. Si le temps de survie a dépassé gc_maxlifetime, alors la session. est supprimé.

Jusqu'à présent, tout fonctionne bien. Alors pourquoi gc_maxlifetime devient-il invalide ?

Par défaut, les informations de session seront enregistrées dans le répertoire de fichiers temporaires du système sous forme de fichiers texte. Sous Linux, ce chemin est généralement \tmp, et sous Windows, il s'agit généralement de C:\Windows\Temp. Lorsqu'il y a plusieurs applications PHP

sur le serveur, elles enregistreront leurs fichiers de session dans le même répertoire. De même, ces applications PHP démarreront également GC avec une certaine probabilité et analyseront tous les fichiers de session.

Le problème est que lorsque le GC fonctionne, il ne fait pas la distinction entre les sessions sur les différents sites. Par exemple, le gc_maxlifetime du site A est défini sur 2 heures et le gc_maxlifetime du site B est défini sur 24 minutes par défaut. Lorsque le GC du site B démarre, il analysera

Analysez le répertoire public des fichiers temporaires et supprimez tous les fichiers de session datant de plus de 24 minutes, qu'ils proviennent du site A ou B. De cette façon, le paramètre gc_maxlifetime du site A est inutile.

Il est facile de trouver le problème et de le résoudre. Modifiez le paramètre session.save_path ou utilisez la fonction session_save_path() pour pointer le répertoire où la session est enregistrée vers un répertoire dédié. Le paramètre gc_maxlifetime fonctionne normalement.

Un autre problème est que gc_maxlifetime ne peut garantir que le temps de survie de la session le plus court et ne peut pas être enregistré. Passé ce délai, les informations de la session seront immédiatement supprimées. Étant donné que GC est démarré en fonction de la probabilité, il peut ne pas être démarré avant une longue période

, donc un grand nombre de sessions seront toujours valides après avoir dépassé gc_maxlifetime.

Une façon de résoudre ce problème est d'augmenter la probabilité de session.gc_probability/session.gc_divisor S'il est mentionné à 100%, ce problème sera complètement résolu, mais il aura évidemment un impact sérieux sur les performances. Une autre méthode consiste à

l'implémenter vous-même en utilisant uniquement PHP, à créer une classe de session et à écrire le délai d'expiration lorsque la session est écrite. Lors de la lecture, déterminez s'il a expiré en fonction du délai d'expiration.

class Session{  
      
        /** 
         * 设置session 
         * @param String $name   session name 
         * @param Mixed  $data   session data 
         * @param Int    $expire 超时时间(秒) 
         */  
        public static function set($name, $data, $expire=600){  
            $session_data = array();  
            $session_data['data'] = $data;  
            $session_data['expire'] = time()+$expire;  
            $_SESSION[$name] = $session_data;  
        }  
      
        /** 
         * 读取session 
         * @param  String $name  session name 
         * @return Mixed 
         */  
        public static function get($name){  
            if(isset($_SESSION[$name])){  
                if($_SESSION[$name]['expire']>time()){  
                    return $_SESSION[$name]['data'];  
                }else{  
                    self::clear($name);  
                }  
            }  
            return false;  
        }  
      
        /** 
         * 清除session 
         * @param  String  $name  session name 
         */  
        private static function clear($name){  
            unset($_SESSION[$name]);  
        }  
      
    }  
    demo.php  
      
    session_start();  
      
    $data = '123456';  
    session::set('test', $data, 10);  
    echo session::get('test'); // 未过期,输出  
    sleep(10);  
    echo session::get('test'); // 已过期

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn