La durée de validité de session par défaut en PHP est de 1440 secondes (24 minutes) [weiweiok Note : La valeur par défaut en php5 est de 180 minutes], c'est-à-dire que si le client ne s'actualise pas pendant plus de 24 minutes, la session en cours expirera. Évidemment, cela ne suffit pas.
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 cette manière, toutes les sessions expirées peuvent être supprimées via des instructions SQL et la période de validité de. la session peut être contrôlée 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 lit le fichier pour obtenir la valeur de la variable. Le SessionID peut utiliser le Cookie du client ou le Query_String du protocole Http1. 1 (c'est-à-dire la partie après le « ? » de l'URL accédée) est transmis au serveur, puis le serveur lit le répertoire de la Session...
Pour réaliser la vie permanente de la Session, vous devez d'abord comprendre les paramètres PHP .ini liés à 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 est transmis par Cookie. Sinon, utilisez Query_String pour transmettre
2. Cookie ou Query_String à transmettre. 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. La valeur par défaut est 0, ce qui signifie que le SessionID sera invalidé. dès la fermeture du navigateur... 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 avez l'autorisation d'utiliser le serveur, la configuration est très, très simple. Il vous suffit de suivre les étapes suivantes :
1 Réglez "session.use_cookies" sur 1 et activez les cookies. stockage. SessionID, mais la valeur par défaut est 1, n'a généralement pas besoin d'être modifié ;
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 infini positif) ;
3. "session.gc_maxlifetime" est défini à la même heure que "session.cookie_lifetime"
Il est clairement indiqué dans la documentation PHP que le paramètre permettant de 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_pisor (qui peut également être modifiée via la fonction php.ini ou ini_set()) . Par défaut, session.gc_probability = 1, session.gc_pisor = 100, ce qui signifie qu'il y a une probabilité de 1 % que le 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. , remplacez la suppression de session.
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, les gc_maxlifetime
paramètres du site A ne servent à rien.
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, est-ce 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_pisor. 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'autorité d'exploitation du 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 !
-------------------------------------------------------------- --- ----------------------------------------------------
Le code est le suivant :
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, "/");
Post-scriptum :
En fait, un véritable stockage permanent est impossible, car la durée de stockage des cookies est limitée, et l'espace du serveur est également limité... …Mais pour certains sites qui doivent être sauvegardés 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 de le code .
Le code est le suivant :
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);
Je ne comprends toujours pas d'où viennent les paramètres open et write. Deux fonctions couramment utilisées pour modifier la configuration de php.ini : get_cfg_var('session.gc_maxlifetime') : récupère la valeur de session.gc_maxlifetime ini_set('session.cookie_lifetime','0') : définissez la valeur de session.cookie_lifetime sur 0.
Recommandations de sujets connexes : session php (y compris des photos, des vidéos, des cas)
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!