Maison > php教程 > PHP开发 > le corps du texte

Comment empêcher SESSION d'expirer en PHP Introduction au principe et à la solution.

高洛峰
Libérer: 2016-12-24 09:29:58
original
1282 Les gens l'ont consulté

Comment maintenir SESSION en PHP et quelques réflexions qui en découlent. Un projet récent contenait un formulaire relativement volumineux, il a fallu beaucoup de temps aux utilisateurs pour le terminer. ils ont découvert la SESSION dès qu'ils l'ont soumise. Elle a expiré et le système s'est fermé, il est donc devenu nécessaire d'étudier comment configurer SESSION et maintenir SESSION en ligne.

Qu'est-ce que la SESSION ?
Selon l'explication WIKI, SESSION est l'information interactive qui existe entre deux appareils de communication. Elle est établie à un certain moment et expire après une certaine période de temps. Les SESSIONS courantes incluent : SESSION TCP, SESSION WEB (SESSION HTTP), SESSION DE CONNEXION, etc.

Selon les différentes positions d'implémentation de session dans le modèle OSI, SESSION est principalement divisée en plusieurs types. L'un est la session de couche application, y compris la SESSION WEB (SESSION HTTP) et la session de connexion à distance telnet ; la mise en œuvre inclut le protocole d'initiation de session (SIP) et l'appel téléphonique Internet ; TCP SESSION est implémenté au niveau de la couche de transport.

Cet article traite principalement de la SESSION WEB. Il existe généralement deux types : la SESSION côté client et la SESSION côté serveur. Cette dernière est la plus courante fournie par les Java Beans.

À quoi sert SESSION ?
Dans le domaine informatique, notamment dans le réseau, SESSION est particulièrement largement utilisée. Elle peut aussi être appelée dialogue (Dialogue), conversation, etc. Elle fait généralement référence à l'état stocké entre deux appareils de communication. Parfois, cela se produit également. entre l'utilisateur et entre les ordinateurs (SESSION de connexion).

Différent de la communication sans état, SESSION est généralement utilisée pour stocker l'état de la communication. Par conséquent, au moins l'une des deux parties communicantes doit stocker l'historique de SESSION pour établir la communication entre les deux.

Comment SESSION (WEB SESSION) est-elle mise en œuvre ?
Lorsque la communication HTTP est effectuée entre le navigateur et le serveur, un cookie HTTP est généralement inclus pour identifier l'état. Il existe généralement un SESSIONID unique qui enregistre généralement certaines informations de vérification et les niveaux de l'utilisateur.

Les jetons de session HTTP les plus couramment utilisés dans plusieurs langages de programmation sont JSESSIONID (JSP), PHPSESSID (PHP), ASPSESSIONID (ASP). Cet identifiant est généralement généré par une fonction de hachage et peut le représenter de manière unique. utilisateur. L'identité est stockée sur le client en tant que paramètre GET ou POST lorsque le serveur communique avec le client.

Il existe généralement deux façons d'implémenter SESSION, SESSION côté serveur et SESSION côté client. Les deux méthodes ont leurs propres avantages et inconvénients.

La SESSION côté serveur est facile à mettre en œuvre et relativement efficace, mais lorsqu'il s'agit d'exigences d'équilibrage de charge ou de haute disponibilité, elle est également plus difficile à gérer lorsqu'il n'y a pas de périphérique de stockage dans l'endogène. système de. L'équilibrage de charge peut être obtenu en partageant des systèmes de fichiers ou en obligeant les clients à se connecter à un seul serveur, mais cela réduira l'efficacité. Pour les appareils sans stockage, l'implémentation de SESSION côté serveur peut également être résolue en utilisant la RAM (voir référence 6). Cette méthode est efficace pour les systèmes avec des connexions client limitées (comme les périphériques de routage ou de point d'accès).

L'utilisation de SESSION côté client peut résoudre certains problèmes de SESSION côté serveur, comme éviter les algorithmes d'équilibrage de charge, etc., mais elle entraînera également ses propres problèmes. Client SESSION utilise des cookies et une technologie de cryptage pour enregistrer l'état entre les différentes requêtes. Après la fin de chaque page dynamique, la SESSION en cours sera comptée et renvoyée au client. Après chaque requête réussie, le cookie sera envoyé au serveur pour permettre au serveur de « se souvenir » de l'identité de l'utilisateur. Le problème le plus important avec le client SESSION est la sécurité. Une fois le cookie piraté ou falsifié, la sécurité des informations de l'utilisateur sera perdue.

Comment définir SESSION en PHP ?
Après avoir configuré l'environnement de développement PHP, vous pouvez visualiser les parties liées à SESSION via phpinfo(), notamment :
Le module SESSION, en version PHP V5.2.9, comporte un total de 25 variables. Parmi eux, certains qui sont souvent utilisés dans la vie quotidienne sont :

session.cookie_lifetime 设置存储SESSIONID的cookie过期时间
session.name SESSION的COOKIE名称,默认为PHPSESSID
session.save_handler SESSION的存储方式,默认为FILE
session.save_path Fedora下面默认存储在/var/lib/php/session
session.gc_probability
session.gc_divisor
session.gc_maxlifetime 这三个选项用来处理GC机制发生的机率
session.cache_limiter (nocache,private,private_no_expire,public)
session.cache_expire 这两个选项是用来缓存SESSION的页面
Copier après la connexion

Considérons d'abord la première question, combien de temps faut-il pour que SESSION expire et comment expire-t-elle ? Si vous souhaitez utiliser SESSION dans un programme PHP, vous devez d'abord référencer session_start(). Une fois cette fonction exécutée, un fichier SESSION sera généré dans le répertoire de stockage de SESSION (si un gestionnaire de fichiers est utilisé). vide. En même temps, parcourez. Le serveur accédera à un cookie nommé PHPSESSID, qui stocke un nom de SESSION haché.


L'expiration de SESSION dépend d'un mécanisme de garbage collection (Garbage Collection). Une fois la SESSION créée, elle est stockée sous forme de fichier sur le serveur. variables dans SESSION à chaque fois, l'heure d'accès au fichier SESSION sera mise à jour. Chaque visite demande la SESSION unique stockée sur le serveur en fonction du SESSIONID stocké sur le client. Lorsque le cookie du client expire, il est impossible de savoir à quelle SESSION accéder, bien que le fichier SESSION sur le serveur n'ait pas encore été consulté après. l'expiration entraînera un gaspillage des ressources du serveur.

但是同时,如果我们希望用户的session马上过期的话,我们就可以通过设置cookie的办法来实现。SESSION的回收是在每次访问页面的时候进 行的,回收的机率由session.gc_probability,session_gc_divisor指定,默认士1/100。如果设置为1,则每次 超过了SESSION的生存周期去访问的话,SESSION一定会被回收。

两种需求:
1、保持SESSION不过期或延长SESSION过期时间;
2、使SESSION立即过期。

1、保持SESSION不过期和延长SESSION过期时间非常必要,特别是在内部应用系统中或者有很大的表单的时候。想想你的老板在填写一个表单,刚好 碰上午饭时间,留着这个表单等吃饭回来,填写完剩余的内容,提交后他看到什么,一般来说都是一个登录界面。想要提高用户体验,关键是要让老板的表单不出问 题,我们就必须延长SESSION的生存周期。

保持SESSION不过期和延长SESSION过期时间,可以通过设置session.gc_maxlifetime来实现,不过首先需要保证客户端的 cookie不会在gc执行回收之前失效。通过设置一个较长的gc_maxlifetime可以实现延长session的生存周期,可是对于不是所有请求 都会保持很久的应用来说,这么做对于服务器配置显然不是一个最佳的选择。
我们知道SESSION的回收机制是根据SESSION文件的最后访问时间来判断的,如果超过了maxlifetime,则根据回收机率进行回收。所以我们只需要定期的去访问一下SESSION就可以了,而这可以通过刷新页面来实现,根据这个思路,解决的方法就有了。

通过JS定期的去访问页面;
利用Iframe定期的刷新页面;

直接利用程序发送HTTP请求,这样就可以避免在页面中嵌入其他的元素;

下面是利用JS发送请求实现的保持SESSION不过期的实现方法,这样我们就只需要在需要SESSION保持长时间的页面(比如大表单页面)。

<script type=”text/javascript”>
 function keepMeAlive(imgName){
myImg = document.getElementById(imgName);
 if(myImg) myImg.src = myImg.src.replace(/\?.*$/, ‘?&#39; + Math.random());
}
window.setInterval(“keepMeAlive(‘phpImg&#39;);”, 4000);
 </script>
Copier après la connexion


其中URL后加入一个随机数是为了避免这个链接的请求被浏览器缓存。


2、使SESSION立即过期的方法就比较多了,我们可以session_destroy(),也可以用上面的思路,请求一个session_destroy的页面。

SESSION安全吗?
PHP的手册中明确写出:SESSION并不能保证储存在SESSION中的信息一定只能被他的创建者所看到。

如果想要安全的处理一些远程的操作,那么HTTPS是唯一的选择。最基本的,不要认为一个用户信息在SESSION中存在就认为这个用户一定就是他本人, 虽然SESSION中的信息会给你他已经经过了用户名和密码验证的假象。所以,如果需要做一些修改密码或者类似的事情的时候,让用户重新输入密码是一个比 较好的选择。

早期的Apache版本并没有采用COOKIE的方式来存储PHPSESSID,而是采用的URL-rewrite,也就是每个URL后面都会加上 PHPSESSID=来表明它属于那个激活的SESSION,新版的Apache已经将这个属性设置为默认关闭。

session.use_trans_id = 0;
Copier après la connexion

所以从这个意义上来讲,延长SESSION的时间过长或者保持SESSION一直在线对于安全来说始终不是一件好事情。终极的解决办法就是用户提交跳转到 登录窗口,登录后又能够回到填写页面,并且所有的数据都还在。这个的实现方式现在用Ajax来解决应该没什么困难,每隔一定时间就把当前的用户数据 POST到一个存储位置,不管是XML或者JSON。


拾遗:
对于客户端不支持JavaScript的情况可以采用的方法:
1、写一个浮层,显示在最顶层,如果用户未禁用JS,则让浮层消失;
2、将所有的INPUT都设置为disable,然后再用JS设置为enabled;
以上这两种方式都是在JS被禁用的时候,所有功能都不能用,如何在JS被禁用的情况下使我们的应用仍然正常工作,这个貌似就比较困难。实现这个的所花的时间和所收到的效果大家要权衡一下。

更多PHP中怎样保持SESSION不过期 原理及方案介绍相关文章请关注PHP中文网!

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