Maison  >  Article  >  php教程  >  Comment définir avec précision le délai d'expiration de la session en php

Comment définir avec précision le délai d'expiration de la session en php

高洛峰
高洛峰original
2016-12-24 09:19:151339parcourir

Dans la plupart des cas, nous utilisons le paramètre par défaut pour l'heure d'expiration de la session, mais pour certains cas ayant des exigences particulières, nous pouvons définir l'heure d'expiration de la session.

Pour cela, vous pouvez définir php.ini en PHP et trouver session.gc_maxlifetime = 1440 #(PHP5 par défaut est de 24 minutes)
Ici, vous pouvez définir l'heure d'expiration à volonté. Mais certaines personnes disent cela. après réglage, ça ne semble pas fonctionner !
En fait, ce n'est pas que ça ne marche pas, mais parce que le système par défaut :

session.gc_probability = 1
session.gc_divisor = 1000

il y a une probabilité que 1. /1000 signifie qu'une seule session sera recyclée toutes les 1000 fois.
Tant que votre volume de visites est important, vous pouvez obtenir l'effet de recyclage
Ou vous pouvez également définir la valeur de session.gc_divisor,
Par exemple : session.gc_divisor = 1, ce qui sera évident. Vous pouvez voir l'effet de l'expiration de la SESSION

Le paramètre le plus couramment utilisé se trouve dans le programme php, comme indiqué dans l'exemple de programme suivant :

<?php
if(!isset($_SESSION[&#39;last_access&#39;])||(time()-$_SESSION[&#39;last_access&#39;])>60)
$_SESSION[&#39;last_access&#39;] = time();
?>

C'est fait, si vous le souhaitez. pour définir l'expiration Il peut également être implémenté dans le programme :

<?php
unset($_SESSION[&#39;last_access&#39;]);// 或 $_SESSION[&#39;last_access&#39;]=&#39;&#39;;
?>

La session a un mécanisme d'expiration :

session.gc_maxlifetime Il s'avère que l'expiration de la session est un événement à faible probabilité, et session.gc_probability et session sont utilisés respectivement gc_divisor pour déterminer la probabilité d'exécuter gc dans la session. Les valeurs par défaut de session.gc_probability et session.gc_divisor sont respectivement 1 et 100. sont respectivement le numérateur et le dénominateur, donc la probabilité que gc s'exécute dans la session est de 1 %. Si vous modifiez ces deux valeurs, cela réduira l'efficacité de PHP. Cette approche est donc fausse ! !
Par conséquent, 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-vous Un service Web (généralement Apache) fera l'affaire.

Quand se produit le « recyclage » de session :

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 "toutes les 100 fois". Une collecte s'est produite pour la requête 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 que dans ce cas gc_maxlifetime=120, si un fichier de session est dernière modification L'heure est il y a 120 secondes, alors la session est 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. A ce moment, vous devez supprimer régulièrement les sessions expirées manuellement (ou crontab) :

cd /path/to/sessions; find -cmin +24 | xargs rm

La session en PHP n'expire jamais

Ne pas modifier le programme est le meilleur moyen, car si vous modifiez le programme, le service de test doit être très déprimé, donc la seule façon de modifier la configuration de l'environnement système est en fait très simple. Ouvrez le fichier de paramètres php.ini et modifiez les trois lignes comme suit :

1. session.use_cookies

La valeur de this est définie sur 1 et les cookies sont utilisés pour transmettre l'ID de session

2 session.cookie_lifetime

Cela représente l'heure à laquelle l'ID de session est stocké. dans le cookie client. La valeur par défaut est 0, ce qui signifie que le navigateur ferme SessionID. C'est invalide... C'est pour cette raison que les sessions PHP ne peuvent pas être utilisées en permanence ! Alors fixons-le à un nombre que nous pensons grand, que diriez-vous de 999999999, ce n'est pas grave ! c'est tout.

3. 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 ! Alors définissons-le également sur 99999999.

C'est tout, tout va bien. Bien sûr, si vous n'y croyez pas, testez-le et voyez - organisez une session et revenez après 10 jours et demi pour voir si votre ordinateur ne fonctionne pas. éteint ou éteint, vous pouvez toujours voir l'ID de session.

Bien sûr, il est également possible que vous n'ayez pas l'autorité pour contrôler le serveur et que vous n'ayez pas autant de chance que moi de modifier les paramètres du php.ini. Nous avons un moyen de nous fier à nous-mêmes. , nous devons utiliser le client pour stocker les cookies. Le sessionID obtenu est stocké dans le cookie du client, définit la valeur de ce cookie, puis transmet cette valeur à la fonction session_id(). 🎜>

<?php
session_start(); // 启动Session
$_SESSION[&#39;count&#39;]; // 注册Session变量Count
isset($PHPSESSID)?session_id($PHPSESSID):$PHPSESSID = session_id();
// 如果设置了$PHPSESSID,就将SessionID赋值为$PHPSESSID,否则生成SessionID
$_SESSION[&#39;count&#39;]++; // 变量count加1
setcookie(&#39;PHPSESSID&#39;, $PHPSESSID, time()+3156000); // 储存SessionID到Cookie中
echo $count; // 显示Session变量count的值
?>


L'échec de la session ne sera pas transmis

Écrivons d'abord un fichier php : a3358401e79a3858445207450bf7e497, et transmettez-le au serveur pour voir la configuration des paramètres du serveur.

Allez dans la section session et voyez que le paramètre session.use_trans_sid est défini sur zéro.

Ce paramètre spécifie s'il faut activer la prise en charge transparente du SID, c'est-à-dire si la session est transmise avec l'URL. Ma compréhension personnelle est qu'une fois ce paramètre défini sur 0, une session sera ouverte pour chaque URL. De cette façon, les pages suivantes ne peuvent pas suivre la session de la page précédente, ce que nous appelons non livrable. Les deux pages génèrent deux fichiers de session côté serveur et ne sont pas liées. (Le principe précis ici doit être confirmé)
Une solution consiste donc à changer la valeur de session.use_trans_sid à 1 dans le fichier de configuration php.ini.

Bien sûr nous savons que tout le monde n'a pas le pouvoir de changer la configuration de php, alors quelles sont les solutions indirectes ?

Deux exemples seront utilisés pour illustrer :

Fichier 1 test1.php

<?php
//表明是使用用户ID为标识的session
session_id(SID);
//启动session
session_start();
//将session的name赋值为Havi
$_SESSION[&#39;name&#39;]="Havi";
//输出session,并设置超链接到第二页test2.php
echo "<a href="test2.php" rel="external nofollow" >".$_SESSION[&#39;name&#39;]."</a>";
?>


Fichier 2 : test2.php

<?php
表明是使用用户ID为标识的session
session_id(SID);
//启动session
session_start();
//输出test1.php中传递的session。
echo "This is ".$_SESSION[&#39;name&#39;];
?>

所以,重点是在session_start();前加上session_id(SID);,这样页面转换时,服务器使用的是用户保存在服务器session文件夹里的session,解决了传递的问题。
不过有朋友会反映说,这样一来,多个用户的session写在一个SID里了,那Session的价值就发挥不出来了。所以还有一招来解决此问题,不用加session_id(SID);前提是你对服务器的php.ini有配置的权限:
output_buffering改成ON,道理就不表了。
第二个可能的原因是对服务器保存session的文件夹没有读取的权限,还是回到phpinfo.php中,查看session保存的地址:

session.save_path: var/tmp

   


所以就是检查下var/tmp文件夹是否可写。
写一个文件:test3.php来测试一下:

<?php
echo var_dump(is_writeable(ini_get("session.save_path")));
?>

   


如果返回bool(false),证明文件夹写权限被限制了,那就换个文件夹咯,在你编写的网页里加入:

//设置当前目录下session子文件夹为session保存路径。
$sessSavePath = dirname(__FILE__).&#39;/session/&#39;;
//如果新路径可读可写(可通过FTP上变更文件夹属性为777实现),则让该路径生效。
if(is_writeable($sessSavePath) && is_readable($sessSavePath))
{
session_save_path($sessSavePath);
}

   


更多php中实现精确设置session过期时间的方法相关文章请关注PHP中文网!

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