Maison > développement back-end > Problème PHP > Explication détaillée de l'utilisation de la session en php

Explication détaillée de l'utilisation de la session en php

hzc
Libérer: 2023-03-01 16:40:01
original
3173 Les gens l'ont consulté

Explication détaillée de l'utilisation de la session en php

Déclaration et utilisation de Session

Le paramétrage de Session est différent de Cookie et doit être fait en premier. Pour commencer, session_start() doit être appelée en PHP. Le format de syntaxe de la fonction session_start() est le suivant :

Bool session_start(void) //Créer une session, démarrer une session et initialiser la session

Remarque : il ne peut y en avoir sortie avant la fonction session_start()

Lorsque vous visitez le site Web pour la première fois, la fonction Seesion_start() créera un ID de session unique et enregistrera automatiquement l'ID de session dans le cookie client via l'en-tête de réponse HTTP. Dans le même temps, un fichier nommé d'après l'ID de session est également créé côté serveur pour enregistrer les informations de session de l'utilisateur. Lorsque le même utilisateur visite à nouveau ce site Web, l'ID Seesion enregistré dans le cookie sera automatiquement transféré via l'en-tête de la requête HTTP. À ce stade, la fonction Session_start() n'attribuera pas de nouvel ID de session, mais recherchera le disque dur du serveur. disque pour un fichier de session portant le même nom que l'ID de session, lisez les informations de session précédemment enregistrées pour cet utilisateur et appliquez-les dans le script actuel pour atteindre l'objectif de suivi de cet utilisateur. La session est utilisée sous la forme d'un tableau, tel que : $_SESSION['session name']

Recommandations de sujets connexes : session php (y compris images, textes et vidéos, cas)

Enregistrez une variable de session et lisez Session

  Lorsque vous utilisez des variables de session en PHP, en plus de démarrer, vous devez également passer par l'enregistrement processus. L'enregistrement et la lecture des variables de session s'effectuent en accédant au tableau $_SESSION. Les noms de clés dans le tableau associatif $_SESSION ont les mêmes règles de dénomination que les variables ordinaires en PHP. Le code pour enregistrer les variables de session est le suivant :

<?php
//启动session的初始化
session_start();
//注册session变量,赋值为一个用户的名称
$_SESSION["username"]="skygao";
//注册session变量,赋值为一个用户的ID
$_SESSION["uid"]=1;
?>
Copier après la connexion

Après l'exécution de ce script, les deux variables de session seront enregistrées dans un fichier côté serveur. L'emplacement du fichier se fait via le fichier php.ini. Dans la session Dans le répertoire spécifié par l'attribut .save_path.

Désenregistrement des variables et destruction de la session

Lorsqu'une variable de session est utilisée, elle peut être supprimée, et lorsqu'une session est terminée, elle peut également être détruite. Si l'utilisateur se déconnecte du système Web, une fonction de déconnexion doit lui être fournie et toutes ses informations seront détruites sur le serveur. Pour détruire toutes les données liées à la session en cours, vous pouvez appeler la fonction session_destroy() pour mettre fin à la session en cours et effacer toutes les ressources de la session. Le format de syntaxe de cette fonction est le suivant :

  bool session_destroy(void) //销毁和当前Session有关的所有资料
Copier après la connexion

Cette fonction ne libérera pas les variables liées à la session en cours, ni ne supprimera le SessionID enregistré dans le cookie client. Étant donné que l'utilisation du tableau $_SESSION et du tableau personnalisé est la même, nous pouvons utiliser la fonction unset() pour libérer une seule variable enregistrée dans la session. Comme indiqué ci-dessous :

  unset($_SESSION[&#39;键名&#39;]);
Copier après la connexion

Veillez à ne pas utiliser unset($_SESSION) pour supprimer l'intégralité du tableau $_SESSION, vous ne pourrez donc plus enregistrer de variables via le tableau super global $_SESSION. Mais si vous souhaitez supprimer toutes les variables enregistrées par un utilisateur dans la session, vous pouvez directement affecter la variable tableau $_SESSION à un tableau vide. Comme indiqué ci-dessous :

 $_SESSION=array()
Copier après la connexion

La session par défaut de PHP est basée sur le cookie. L'ID de session est stocké dans le cookie du client par le serveur, donc lorsque vous vous déconnectez de la session, vous devez également effacer l'ID de session enregistré dans le cookie. , et cela nécessite l'aide de la fonction setCookie () pour être complétée. Dans un script PHP, le nom de la session peut être obtenu en appelant la fonction session_name(). Supprimez le SessionID enregistré dans le cookie client. Le code est le suivant :

<?php
//判断Cookie中是否存在session ID
if(isset($_COOKIE[session_name()])){
    //删除包含Session ID的cookie,注意第四个参数一定要和php.ini设置的路径相同
    setcookie(session_name(),&#39;&#39;,time()-3600,&#39;/&#39;);
}
?>>
Copier après la connexion

De l'introduction précédente, nous pouvons conclure que le processus de déconnexion de la session nécessite un total de 4 étapes. Dans l'exemple suivant, le code complet en quatre étapes est fourni. L'exécution du script fermera la session et détruira toutes les ressources liées à cette session. Le code est le suivant :

<?php
//第一步:开启Session并初始化
session_start();

//第二部:删除所有Session的变量,也可以用unset($_SESSION[XXX])逐个删除
$_SESSION = array();

//第三部:如果使用基于Cookie的session,使用setCookkie()删除包含Session ID的cookie
if(isset($_COOKIE[session_name()])) {
    setCookie(session_name(), "", time()-42000, "/");
}

//第四部:最后彻底销毁session
session_destroy();

?>
Copier après la connexion

Options de configuration phpini pour la session

Plusieurs options de configuration courantes liées au fichier php.ini et à la session :

 session.auto_start = 0 ; Initialiser au démarrage de la requête session

session.cache_expire = 180 ; Définir le document de session dans le cache pour qu'il expire après n minutes

session.cookie_lifetime = 0 ; Définir la durée de stockage en secondes cookie , ce qui équivaut à définir le délai d'expiration de Session Lorsqu'il est 0, cela signifie jusqu'au redémarrage du navigateur session.auto_start=1, il n'est donc pas nécessaire d'appeler session à chaque fois avant d'utiliser session_start(). non recommandé. Mais il existe plusieurs façons d'activer cette option. Limitation, si session.auto_start est effectivement activé, les objets ne peuvent pas être placés dans la session car la définition de classe doit être chargée avant de démarrer la session pour recréer l'objet dans la session.

session.cookie_path = / ; cookie的有效路径session.cookie_domain = ; cookie的有效域session.name = PHPSESSID; 用在cookie里的session的名字session.save_handler = files ; 用于保存/取回数据的控制方式session.save_path = /tmp ; 在 save_handler 设为文件时传给控制器的参数, 这是数据文件将保存的路径.session.use_cookies = 1 ; 是否使用cookies
Copier après la connexion

Mécanisme automatique de collecte des ordures de la session

可以通过session_destroy()函数在页面中提供一个“退出”按钮,通过单击销毁本次会话。但如果用户没有单击退出按钮,而是直接关闭浏览器,或断网等情况,在服务器端保存的Session文件是不会删除的。虽然关闭浏览器,下次需要重新分配一个新的Session ID重新登录,但这只是因为在php.ini中的设置seesion.cookie_lifetime=0,来设定Session ID在客户端Cookie中的有效限期,以秒为单位指定了发送到浏览器的Cookie的生命周期。当系统赋予Session有效期限后不管浏览器是否开启,Session ID都会自动消失。而客户端Session ID消失服务器端保存的Session文件并没有被删除。所以没有被Sessoin ID引用的服务器端Session文件,就成为了“垃圾”。

服务器保存的Session文件就是一个普通文本文件,所以都会有文件修改时间。“垃圾回收程序”启动后就是根据Session文件的修改时间,将所有过期的Session文件全部删除。通过在php.ini中设置session.gc_maxlifetime选项来指定一个时间(单位:秒),例如设置该选项值为1440(24分钟)。“垃圾回收程序”就会在所有Session文件中排查,如果有修改时间距离当前系统时间大于1440秒的就将其删除。

“session垃圾回收程序”是怎样的启动机制呢?“垃圾回收程序”是在调用session_start()函数时启动的。而一个网站有多个脚本,没有脚本又都要使用session_start()函数开启会话,又会有很多个用户同时访问,这就很可能session_start()函数在1秒内被调用N次,而如果每次都会启动“session垃圾回收程序”,这样是很不合理的。可以通过php.ini文件中修改“session.gc_probability和session.gc_pisor”两个选项,设置启动垃圾回收程序的概率。会根据“session.gc_probability/session.gc_pisor”公示计算概率,例如选项session.gc_probability=1,而选项session.gc_pisor=100,这样的概率就是“1/100”,即session_start()函数被调用100次才会有一次可能启动“垃圾回收程序”。

php.ini中相关的配置

session.cookie_lifetime=0; 关闭浏览器相应的cookie文件即被删除

session.gc_maxlifetime; 设置过期session时间,默认1440秒(24分钟)

session.gc_probability/session.gc_pisor; 启动垃圾回收机制的概率(建议值为1/1000——5000)

cookie禁用时通过URL传递session的ID

  使用Session跟踪一个用户,是通过在各个页面之间传递唯一的Session ID,并通过Session ID提取这个用户在服务器中保存的Session变量。常见的Session ID传送方法有以下两种。

  第一种方法是基于cookie的方式传递session ID,这种方式更优,但不总是可用, 因为用户在客户端可以屏蔽cokie;

  第二种方法是通过url参数进行传递,直接将session ID嵌入到URL中去。

在Session的实现中通常都是采用Cookie的方式,客户端保存的Session ID就是一个Cookie。当客户禁用Cookie时,Session ID就不能在Cookie中保存,也就不能在页面之间传递,此时Session失效。不过PHP5在Linux平台可以自动检查Cookie状态,如果客户端禁用它,则系统自动把Session ID附加到URL上传送。而使用Windows系统作为Web服务器则无此功能。

  在PHP中提出了跟踪Session的另一种机制,如果客户浏览器不支持Cookie,则PHP可以重写客户请求的URL,把Session ID添加到URL信息中。可以手动地在每个超链接的URL中都加上一个Session ID,但工作量比较大,不建议使用这种方法。如下所示:

<?php
//开启session
session_start();
//在每个URL后面附加上参数,变量名为session_name()获取名称,值通过session_id()获取
echo &#39;<a href="demo.php?&#39;.session_name().&#39;=&#39;.session_id().&#39;">连接演示</a>&#39;;
?>
在使用Linux系统做服务器时,则在编辑PHP时如果使用了–enable-trans-sid配置选项,和运行时选项session.use_trans_sid都被激活,在客户端禁用Cookie时,相对URL将被自动修改为包含会话ID。如果没有这么配置,或者使用Windows系统作为服务器时,可以使用常量SID。该常量在会话启动时被定义,如果客户端没有发送适当的会话Cookie,则SID的格式为session_name=session_id,否则就为一个空字符串。因此可以无条件地将其嵌入到URL中去。在下例中使用两个脚本程序,演示了Session ID的传送方法。
<?php
session_start();
$_SESSION["username"]="admin";
echo "session ID:".session_id()."<br>";
?>
Copier après la connexion

推荐教程: 《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!

É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