Maison > php教程 > PHP开发 > le corps du texte

Collecte de données d'analyse invalide de session PHP

高洛峰
Libérer: 2016-12-24 09:46:51
original
1120 Les gens l'ont consulté

Analyse invalide de la session PHP

Au cours du processus de développement PHP, certains amis peuvent souvent rencontrer le problème que les fichiers générés par la session ne peuvent pas être automatiquement effacés. En fait, ce n'est pas vraiment impossible à effacer, mais. il y a un problème de probabilité. Tant que votre site a suffisamment de trafic, ces fichiers peuvent être automatiquement effacés. Si le nombre de visites est relativement faible et que les fichiers ne sont pas agréables à l'œil, vous pouvez réaliser l'effacement automatique des fichiers de session en configurant php.ini. La configuration spécifique est la suivante :

Rechercher

.

session.gc_probability = 1
session.gc_divisor = 1000

Les deux paramètres ci-dessus sont en fait cette probabilité. Par défaut, il s'agit de 1/1000

Définir la session. .gc_divisor = 1000 Remplacez session.gc_divisor = 100

Si vous souhaitez obtenir un temps réel complet, vous pouvez changer ce paramètre en 1, donc la probabilité est de 100%

Voyons comment la session fonctionne

Présentation : Chaque requête PHP a une probabilité de 1/100 (valeur par défaut) de déclencher le "recyclage de session". Si un "recyclage de session" se produit, les fichiers /tmp/sess_* seront vérifiés. Si le temps de dernière modification dépasse 1440 secondes (la valeur de gc_maxlifetime), ils seront supprimés, ce qui signifie que ces sessions ont expiré.

1. Comment existe-t-il une session côté serveur (généralement Apache avec module PHP) ?

Par défaut, php enregistrera la session dans le répertoire /tmp, et le nom du fichier sera comme ceci : sess_01aab840166fd1dc253e3b4a3f0b8381. Chaque fichier correspond à une session.

more /tmp/sess_01aab840166fd1dc253e3b4a3f0b8381
username|s:9:”jiangfeng”;admin|s:1:”0〃;
Copier après la connexion

#Nom de la variable|Type : longueur : valeur

Supprimer le fichier de session ici signifie que la session correspondante n'est pas valide.

2. Comment la session existe-t-elle côté client (généralement le navigateur) ?

La session est côté navigateur, il vous suffit de sauvegarder l'ID de session (l'ID unique généré par le côté serveur). Il existe deux manières de l'enregistrer : dans les cookies et dans les URL. Si l'ID de session est enregistré dans le cookie, vous pouvez voir qu'il existe une variable PHPSESID dans le cookie du navigateur. S'il est passé par URL, vous pouvez voir une URL sous la forme :
index.php?PHPSESID=01aab840166fd1dc253e3b4a3f0b8381. (Côté serveur, utilisez session.use_cookies pour contrôler quelle méthode est utilisée)

3. Côté serveur, comment PHP détermine-t-il si le fichier de session a expiré ?

Si le "temps de dernière modification" à "maintenant" dépasse gc_maxlifetime (la valeur par défaut est 1440) secondes, le fichier de session est considéré comme expiré. Lorsque la session suivante est recyclée, si le fichier n'a pas été modifié, le fichier est considéré comme expiré. Le fichier de session sera supprimé (la session expirera).
Pour faire simple, si je me connecte à un site internet et qu'il n'y a aucune opération dans un délai de 1440 secondes (valeur par défaut), alors la session correspondante est considérée comme expirée.
Ainsi, modifier la variable gc_maxlifetime dans le fichier php.ini peut prolonger le délai d'expiration de la session : (par exemple, on modifie le délai d'expiration à 86400 secondes)

session.gc_maxlifetime = 86400

Ensuite, redémarrez simplement votre service Web (généralement Apache).
Remarque : En php5, l'expiration de la session utilise un mécanisme de recyclage. Le temps fixé ici est de 86400 secondes. Si la session n'a pas été modifiée dans un délai de 86400 secondes, elle ne sera supprimée qu'au prochain "recyclage".

4. Quand a lieu la séance de « recyclage » ?

Par défaut, pour chaque requête php, il y aura une probabilité de recyclage de 1/100, cela peut donc être simplement compris comme "un recyclage a lieu pour 100 requêtes php". Cette probabilité est contrôlée par les paramètres suivants
#La probabilité est gc_probability/gc_divisor

session.gc_probability = 1
session.gc_divisor = 100

Remarque 1 : Supposons this Dans ce cas, gc_maxlifetime=120, si un fichier de session a été modifié pour la dernière fois il y a 120 secondes, la session sera toujours valide jusqu'au prochain recyclage (probabilité 1/100).
Remarque 2 : Si votre session utilise session.save_path pour enregistrer la session ailleurs, le mécanisme de recyclage de session peut ne pas traiter automatiquement les fichiers de session expirés. À ce stade, vous devez supprimer régulièrement les sessions expirées manuellement (ou crontab) :

cd /path/to/sessions; find -cmin 24 | 🎜>

Parce que le mécanisme de recyclage va vérifier "l'heure de dernière modification" du fichier, donc si une session est active, mais que le contenu de la session n'a pas changé, alors le fichier de session correspondant n'a pas changé, et le recyclage Le mécanisme considérera cela. Une session qui n'a pas été active depuis longtemps sera supprimée. C'est quelque chose que nous ne voulons pas voir. Nous pouvons résoudre ce problème en ajoutant le code simple suivant :

<?php
if(!isset($_SESSION[&#39;last_access&#39;])||(time()-$_SESSION[&#39;last_access&#39;])>60)
  $_SESSION[&#39;last_access&#39;] = time();
?>
Copier après la connexion

Le code tentera de modifier toutes les 60 secondes. Modifiez la session une fois.

Résumé : Si vous souhaitez modifier le délai d'expiration de la session, modifiez simplement la variable gc_maxlifetime. La session PHP5 utilise un mécanisme de recyclage passif (garbage collection). Les fichiers de session expirés ne disparaîtront pas d'eux-mêmes, mais les sessions expirées seront traitées en déclenchant le « recyclage ».

Examinons en détail quelques autres problèmes liés à la définition de l'heure de session

Paramètre d'heure d'expiration de session

Définissez le paramètre d'heure d'expiration, principalement en définissant session.gc_maxlifetime Définissez simplement les paramètres . Pour un réglage plus sûr, définissez simplement les deux paramètres suivants

ini_set(&#39;session.cookie_lifetime&#39;, 0); // 可用 print_r(session_get_cookie_params()); 观察
ini_set(&#39;session.gc_maxlifetime&#39;, 3600); // 可用 echo ini_get("session.gc_maxlifetime"); 观察
Copier après la connexion

.

session_cookie_lifetime 设为 0 的话, 代表等到 browser 才把此 cookie 清掉.(session 和 browser cookie 是有相关的)

如果懒得想这些, 直接用下面的 function 就可以了

Session 过期时间程式

<?php
function start_session($expire = 0)
{
  if ($expire == 0) {
    $expire = ini_get(&#39;session.gc_maxlifetime&#39;);
  } else {
    ini_set(&#39;session.gc_maxlifetime&#39;, $expire);
  }
  if (empty($_COOKIE[&#39;PHPSESSID&#39;])) {
    session_set_cookie_params($expire);
    session_start();
  } else {
    session_start();
    setcookie(&#39;PHPSESSID&#39;, session_id(), time() + $expire);
  }
}
?>
Copier après la connexion

   

使用方式

于程式最上方加入: start_session(600); // 代表 600 秒后会过期 (取代原本 session_start())
如果要再延长过期时间, 只要再做修改即可.

但是有个问题要注意, 就是 PHP 的 session 预设是存成 file, 所以 /tmp 可能会因这样设定而爆掉(档案太多), 通常解法是把 session 存进 DB/memcache 中.

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多php Session无效分析资料整理相关文章请关注PHP中文网!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!