Maison >développement back-end >Problème PHP >Comment définir le délai d'expiration d'une session en php

Comment définir le délai d'expiration d'une session en php

藏色散人
藏色散人original
2021-06-08 10:03:005110parcourir

Comment définir le délai d'expiration de la session en PHP : 1. Ouvrez php.ini, recherchez et définissez "session.gc_maxlifetime=1440" ; 2. Définissez la valeur de "session.gc_pisor" ; dans le programme PHP Temps d'expiration.

Comment définir le délai d'expiration d'une session en php

L'environnement d'exploitation de cet article : système Windows 7, PHP version 7.1, ordinateur DELL G3

Comment définir avec précision l'heure d'expiration de la session en PHP

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 avec 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 qu'après l'avoir configuré, cela ne semble pas fonctionner !
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

garbage collection ! Il y a une probabilité, 1/1000 correspond à la session 1000. Une seule fois, il a été recyclé.
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();
?>

C'est à dire. Oui, si vous souhaitez définir l'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 Cela tourne. que l'expiration de la session est une faible probabilité. Pour les événements, utilisez respectivement session.gc_probability et session.gc_pisor pour déterminer la probabilité d'exécuter gc dans la session. Les valeurs par défaut de session.gc_probability et session.gc_pisor 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 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 un fichier de session a été modifié pour la dernière fois il y a 120 secondes , alors cette session est toujours valable 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 | xargs rm

La session en PHP n'expire jamais

C'est Il est préférable de ne pas modifier la méthode du programme, car 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. Ouvrez le fichier de paramètres php.ini et modifiez-le. les trois lignes comme suit :

1. session.use_cookies

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

2 , session.cookie_lifetime

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 parce que de ceci 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文件:a3358401e79a3858445207450bf7e497, 传到服务器去看看服务器的参数配置。
转到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);
}

推荐学习:《PHP视频教程

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