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

不言
Libérer: 2023-03-30 06:14:02
original
2342 Les gens l'ont consulté

Cet article présente principalement la méthode pour définir avec précision l'heure d'expiration de la session en PHP. Les amis qui en ont besoin peuvent s'y référer

Dans la plupart des cas, nous utilisons l'heure de réglage par défaut pour l'heure d'expiration de la session, et Pour certains cas ayant des exigences particulières, nous pouvons définir le délai 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 certains disent qu'après l'avoir configuré, cela n'a pas l'air de fonctionner
En fait, ce n'est pas que cela ne fonctionne pas, mais parce que le système se met par défaut :

session.gc_probability = 1
session.gc_pisor = 1000
Copier après la connexion

La collecte des déchets a une probabilité, 1/1000 signifie que la session ne sera recyclée qu'une fois sur 1000.
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();
?>
Copier après la connexion

C'est tout. Si vous souhaitez définir la date d'expiration, vous pouvez également le faire dans le programme :

<?php
unset($_SESSION[&#39;last_access&#39;]);// 或 $_SESSION[&#39;last_access&#39;]=&#39;&#39;;
?>
Copier après la connexion

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é. Session.gc_probability et session.gc_pisor sont utilisés pour déterminer le. probabilité d'exécuter gc dans la session. Les valeurs par défaut de 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. 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. A ce moment, vous devez supprimer régulièrement la session expirée manuellement (ou crontab)

 :
session.gc_probability = 1
session.gc_pisor = 100
Copier après la connexion

Session dans PHP est permanent Non expiré

Ne pas modifier le programme est le meilleur moyen, car si vous modifiez le programme, le service de test sera très déprimé. Vous ne pourrez alors modifier que la configuration de l'environnement système. en fait très simple. Ouvrez le fichier de configuration php.ini, modifiez les trois lignes comme suit :

cd /path/to/sessions; find -cmin +24 | xargs rm
Copier après la connexion
1. session.use_cookies

Définissez cette valeur sur 1 et utilisez les cookies. pour passer sessionid

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 stocké. être invalidé dès la fermeture du navigateur... 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(). 🎜>

L'échec de la session n'est pas délivré

我们先写个php文件:, 传到服务器去看看服务器的参数配置。
转到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>";
?>
Copier après la connexion

文件2: test2.php

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

所以,重点是在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
Copier après la connexion

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

<?php
echo var_dump(is_writeable(ini_get("session.save_path")));
?>
Copier après la connexion

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

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

相关推荐:

PHP 中cookie 和session的联系以及session配置

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!

É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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal