Maison  >  Article  >  développement back-end  >  Explication détaillée de la façon de définir le délai d'expiration de la session en php

Explication détaillée de la façon de définir le délai d'expiration de la session en php

怪我咯
怪我咯original
2017-07-05 09:48:343158parcourir

Cet article présente principalement la méthode pour définir avec précision le délai d'expiration de la session en PHP. Les amis qui en ont besoin peuvent se référer à

Dans la plupart des cas de données, nous utilisons le délai d'expiration de la session. L'heure de réglage par défaut, 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 # (la valeur par défaut de PHP5 est de 24 minutes)
Ici, vous pouvez définir l'heure d'expiration à volonté . Mais certaines personnes disent que cela ne semble pas fonctionner après l'avoir configuré
En fait, ce n'est pas que cela ne fonctionne pas, mais parce que le système par défaut :

session.gc_probability = 1
session.gc_pisor = 1000

collecte des déchets Il y a une probabilité, 1/1000 soit Une session n'est recyclée qu'une fois toutes les 1 000 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_pisor,
Par exemple : session.gc_pisor = 1 , afin que vous puissiez voir clairement l'effet de l'expiration de la SESSION

Le paramètre le plus couramment utilisé se trouve dans le programme php, comme le montre 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();
?>
De cette façon, c'est tout. Si vous souhaitez définir le paramètre d'expiration, vous pouvez également l'implémenter 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 la session expire. C'est un événement à faible probabilité. Utilisez respectivement session.gc_probability et session.gc_pisor pour déterminer la probabilité d'exécuter gc dans la session. gc_pisor valent 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 1/100 de recyclage, donc cela peut être simple Compris comme "un recyclage a lieu toutes les 100 requêtes php". Cette probabilité est contrôlée par les paramètres suivants

#La probabilité est gc_probability/gc_pisor

session.gc_probability = 1
session.gc_pisor = 100
Note 1 :

Supposons que dans ce cas gc_maxlifetime=120, si l'heure de dernière modification d'une session le fichier date d'il y a 120 secondes, 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 les sessions expirées manuellement (ou crontab) à intervalles réguliers:

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

La session en PHP n'expire jamais

Si vous ne modifiez pas le programme, le meilleur moyen est que si vous modifiez le programme, le service de test sera très déprimé, vous ne pourrez donc modifier que la configuration de l'environnement système. En fait, c'est très simple. ini et modifiez les trois lignes comme suit :

1. session.use_cookies

Définissez cette valeur sur 1 et utilisez des cookies pour transmettre l'identifiant de session

2. 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 que le navigateur. le ferme... C'est pour cette raison que la session PHP ne peut pas être utilisée 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. L'ID de session obtenu est stocké dans le cookie du client, définit la valeur de ce cookie, puis transmet cette valeur à la fonction session_id(). La méthode spécifique est la suivante :

<?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的值 
?>

Ne pas réussir si la séance est invalide

我们先写个php文件:799cf9f93092039850bcc04dabf8d4fb, 传到服务器去看看服务器的参数配置。
转到session部分,看到session.use_trans_sid参数被设为了零。
这个参数指定了是否启用透明SID支持,即session是否随着URL传递。我个人的理解是,一旦这个参数被设为0,那么每个URL都会启一个session。这样后面页面就无法追踪得到前面一个页面的session,也就是我们所说的无法传递。两个页面在服务器端生成了两个session文件,且无关联。(此处精确原理有待确认)
所以一个办法是在配置文件php.ini里把session.use_trans_sid的值改成1。

当然我们知道,不是谁都有权限去改php的配置的,那么还有什么间接的解决办法呢?
下面就用两个实例来说明:
文件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>";
?>

文件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);
}

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!

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