Une méthode efficace connue consiste à utiliser session_set_save_handler pour prendre en charge tout le travail de gestion de session. Généralement, les informations de session sont stockées dans la base de données, de sorte que toutes les sessions expirées puissent être supprimées via des instructions SQL et que la période de validité de la session puisse être supprimée. contrôlé avec précision. C’est également une méthode couramment utilisée pour les grands sites Web basés sur PHP. Cependant, pour les petits sites Web ordinaires, il ne semble pas nécessaire de travailler aussi dur.
Mais la Session générale a une durée de vie limitée Si l'utilisateur ferme le navigateur, les variables de Session ne peuvent pas être enregistrées ! Alors, comment pouvons-nous atteindre la durée de vie permanente de Session ?
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. le Cookie du client ou le Query_String du protocole Http1.1 (c'est-à-dire (la partie après le "?" dans l'URL accédée) est transmis au serveur, puis le serveur lit le répertoire de la Session...
Pour réaliser la durée de vie permanente de la Session, vous devez d'abord comprendre les paramètres pertinents de la Session dans php.ini (ouvrez le fichier php.ini, dans la section "[Session]") :
1. La valeur par défaut est "1", ce qui signifie que le SessionID est transmis par Cookie, sinon il est transmis par Query_String
2 session.name : Il s'agit du nom de variable stocké dans SessionID, qui peut être transmis par Cookie ou. Query_String. La valeur par défaut est "PHPSESSID" ;
3. session.cookie_lifetime : Cela représente l'heure à laquelle SessionID est stocké dans le cookie client, ce qui signifie que le SessionID sera invalidé dès que le navigateur. le ferme... 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 les principes et les étapes d'utilisation de la session permanente.
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, non...
Si vous disposez de l'autorité d'exploitation du serveur, la configuration est très, très simple. Il vous suffit d'effectuer les étapes suivantes :
1. Définissez "session.use_cookies" sur 1 et activez 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'infini positif (bien sûr, il n'y a pas de paramètre pour l'infini positif, mais il n'y a pas de différence entre 999999999 et l'infini positif) ;
3. Définir "session.gc_maxlifetime" C'est la même heure que "session.cookie_lifetime"
Il est clairement indiqué dans la documentation PHP que le paramètre pour définir la période de validité de la session est 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 reste à 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 un GC (Garbage Collector) en fonction de la valeur de la variable globale session.gc_probability/session.gc_divisor (qui peut également être modifiée via la fonction php.ini ou ini_set()) . 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 de 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, supprimez-le. la séance.
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:WindowsTemp. 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 GC fonctionne, il ne fait pas la distinction entre les sessions sur 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 analyse le répertoire public des fichiers temporaires et supprime 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.
Une fois que vous avez trouvé le problème, il est facile 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.
À proprement parler, c'est un bug de PHP ?
Un autre problème est que gc_maxlifetime ne peut garantir que la durée de survie de la session la plus courte et ne peut pas être enregistrée. Passé ce délai, les informations de session seront immédiatement supprimées. Étant donné que GC est démarré sur la base d'une probabilité et peut ne pas être démarré avant une longue période, 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 à déterminer la durée de vie de la session en cours dans votre code. Si elle dépasse gc_maxlifetime, effacez la session en cours.
Mais si vous n'avez pas l'autorisation d'utiliser le serveur, ce sera plus gênant. Vous devrez réécrire le SessionID via le programme PHP pour obtenir un stockage permanent des données de session. Consultez le manuel des fonctions de php.net et vous pouvez voir la fonction "session_id": si aucun paramètre n'est défini, le SessionID actuel sera renvoyé. Si les paramètres sont définis, le SessionID actuel sera défini sur la valeur donnée.
Tant que vous utilisez un cookie permanent et ajoutez la fonction "session_id", vous pouvez enregistrer les données de session permanentes !
Mais pour plus de commodité, nous devons connaître le "session.name" défini par le serveur, mais la plupart des utilisateurs n'ont pas la permission de visualiser les paramètres php.ini du serveur. Cependant, PHP fournit une très bonne fonction "phpinfo". ", qui peut être utilisé pour afficher presque toutes les informations PHP !
-------------------------------------------------------------- --- ----------------------------------------------------
session_start(); ini_set('session.save_path','/tmp/'); //6个钟头 ini_set('session.gc_maxlifetime',21600); //保存一天 $lifeTime = 24 * 3600; setcookie(session_name(), session_id(), time() + $lifeTime, "/");
Postscript :
En fait, un véritable stockage permanent est impossible, car la durée de stockage des cookies est limitée, et l'espace serveur est également limité... Mais pour certains sites qui doivent être stockés depuis longtemps, la méthode ci-dessus suffit !
Mettre la session dans mysql Exemple :
Créer une table dans la base de données : session (sesskey varchar32, expiry int11, value longtext)
code :
La base de données a été connectée avant l'exécution du code.
define('STORE_SESSIONS','mysql'); if (STORE_SESSIONS == 'mysql') { if (!$SESS_LIFE = get_cfg_var('session.gc_maxlifetime')) { $SESS_LIFE = 1440; } function _sess_open($save_path, $session_name) { // 如果没有连接数据库,可以在此执行mysql_pconnect,mysql_select_db return true; } function _sess_close() { return true; } function _sess_read($key) { $value_query = mysql_query("select value from sessions where sesskey = '" .addslashes($key) . "' and expiry > '" . time() . "'"); $value = mysql_fetch_array($value_query); if (isset($value['value'])) { return $value['value']; } return false; } function _sess_write($key, $val) { global $SESS_LIFE; $expiry = time() + $SESS_LIFE; $value = $val; $check_query = mysql_query("select count(*) as total from sessions where sesskey = '" . addslashes($key) . "'"); $check = mysql_fetch_array($check_query); if ($check['total'] > 0) { return mysql_query("update sessions set expiry = '" . addslashes($expiry) . "', value = '" . addslashes($value) . "' where sesskey = '" . addslashes($key) . "'"); } else { return mysql_query("insert into sessions values ('" . addslashes($key) . "', '" . addslashes($expiry) . "', '" . addslashes($value) . "')"); } } function _sess_destroy($key) { return mysql_query("delete from sessions where sesskey = '" . addslashes($key) . "'"); } function _sess_gc($maxlifetime) { mysql_query("delete from sessions where expiry < '" . time() . "'"); return true; } session_set_save_handler('_sess_open', '_sess_close', '_sess_read', '_sess_write', '_sess_destroy', '_sess_gc'); } danoo_session_name( 'dtvSid' ); danoo_session_save_path(SESSION_WRITE_DIRECTORY);
ini_set('session.cookie_lifetime','0' ) : Définissez la valeur de session.cookie_lifetime sur 0.
Pour plus d'articles liés aux problèmes de validité de session PHP, veuillez faire attention au site Web PHP chinois !