Maison > Article > Tutoriel système > Comprendre le mécanisme de récupération de place de session en php
Analysons d'abord comment une session est générée en PHP. Le but de la conception de session est de maintenir différents états de chaque utilisateur pour combler les lacunes du protocole HTTP (sans état). Nous avons maintenant une question : nous savons tous que la session est enregistrée sur le serveur puisqu'elle est utilisée pour maintenir le statut de chaque utilisateur, qu'utilise-t-elle pour distinguer les utilisateurs ? A ce moment, vous devez utiliser des cookies. Lorsque nous appelons session_start(); dans le code, PHP générera un fichier chacun dans le répertoire de stockage SESSION (la valeur par défaut est /tmp/) et dans le répertoire des cookies du client. Le nom du fichier de session est comme ceci :
Le format est sess_{SESSIONID}. Pour le moment, il n'y a aucun contenu dans le fichier de session. Lorsque nous avons ajouté ces deux lignes de code dans session_start(); :
.$_SESSION['name'] = 'wanchun0222';$_SESSION['blog'] = 'coderbolg.net'; 这时文件就有内容了:
name|s:11:"wanchun0222";blog|s:13:"coderbolg.net";
Regardez à nouveau le cookie maintenant :
Vous pouvez voir que le serveur a généré automatiquement un cookie pour nous. Le nom du cookie est "PHPSESSID" et le contenu du cookie est une chaîne de caractères. En fait, cette chaîne de caractères est {SESSIONID}. Peut-être comprenez-vous déjà que lorsque nous utilisons une session, PHP génère d'abord un numéro SESSIONID unique (tel que 2bd170b3f86523f1b1b60b55ffde0f66), puis génère un fichier dans le répertoire par défaut de notre serveur avec le nom de fichier sess_{SESSIONID}, à la Parallèlement, un cookie est généré côté client de l'utilisateur actuel, dont le contenu a déjà été mentionné. De cette façon, PHP générera un SESSIONID pour chaque utilisateur, ce qui signifie un fichier de session pour chaque utilisateur. La première fois que PHP utilise une session pour un utilisateur, il écrit un cookie sur le client lors de la prochaine visite de l'utilisateur, le navigateur apportera ce cookie. Après avoir obtenu le cookie, PHP lit le SESSIONID à l'intérieur et conserve ce SESSIONID. dans le répertoire de la session pour trouver le fichier de session. Après l'avoir trouvé, il sera affiché lors de l'appel de $_SESSION['blog'].
Nous comprenons la génération et le principe de fonctionnement de la session et constatons qu'il y aura de nombreux fichiers de session dans le répertoire de session. Bien entendu, ces fichiers ne doivent pas exister éternellement et PHP doit fournir un mécanisme de recyclage expiré. Dans php.ini, session.gc_maxlifetime définit la durée de vie de la session (la valeur par défaut est 1440s). Si l'heure de la dernière mise à jour du fichier de session dépasse la durée de survie, le fichier de session est considéré comme expiré. Il sera supprimé lors du prochain recyclage de la session. Quand la prochaine séance sera-t-elle recyclée ? Ceci est lié au nombre de requêtes php. Dans le mécanisme interne de PHP, lorsque php est demandé N fois, le mécanisme de recyclage sera déclenché une fois. Le nombre de fois qu'une requête est déclenchée est contrôlé par les deux paramètres suivants :
session.gc_probability = 1session.gc_divisor = 100
这是php.ini的默认设置,意思是每100次PHP请求就有一次回收发生。概率是 gc_probability/gc_divisor 。我们了解了服务器端的session过期机制,再来看看客户端的cookie的过期机制。
如果cookie失效了浏览器自然发送不了cookie到服务器,这时即使服务器的session文件存在也没用,因为PHP不知道要读取哪个session文件。我们知道PHP的cookie过期时间是在创建时设置的,那么PHP在创建session的同时为客户端创建的cookie的生命周期是多久呢?这个在php.ini中有设置:session.cookie_lifetime 。这个值默认是0,代表浏览器一关闭SESSIONID就失效。那就是说我们把session.gc_maxlifetime和session.cookie_lifetime设置成同一个值就可以控制session的失效时间了。
由上面的介绍我们可以知道,如果用户关闭了cookie,那我们的session就完全没法工作了。是的,确实是这样。php中session的客户端存储机制只有cookie吗?不是的。既然我们的SESSIONID 不能通过cookie传递到各个页面,那我们还有另一个法宝,就是通过页面GET传值的方式。
PHP可以在cookie被禁用时自动通过GET方式跨页传递SESSIONID,前提是设置php.ini的session.use_trans_sid为1。这时当我们在客户端禁用了cookie时使用了session,并在当前页面通过点击链接到另一页面时,PHP会自动在链接上添加SESSIONID参数,像这样:nextpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66。我想你应该看到了这种方式的缺点:好像不够安全啊。
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!