Maison  >  Article  >  développement back-end  >  Explication détaillée des fonctions couramment utilisées dans Session en PHP

Explication détaillée des fonctions couramment utilisées dans Session en PHP

小云云
小云云original
2018-03-27 14:22:302374parcourir

session_start() créera une nouvelle session ou réutilisera une session existante. Si un identifiant de session est soumis via GET ou POST, ou à l'aide d'un cookie, la session existante sera réutilisée.

Lorsqu'une session démarre automatiquement ou manuellement via session_start(), PHP appelle en interne les fonctions de rappel d'ouverture et de lecture du gestionnaire de session. Le gestionnaire de session peut être celui par défaut de PHP, ou il peut être fourni par une extension (extension SQLite ou Memcached), ou il peut s'agir d'un gestionnaire de session défini par l'utilisateur via session_set_save_handler(). Avec les données de session existantes renvoyées par la fonction de rappel de lecture (stockées à l'aide d'un format de sérialisation spécial), PHP désérialisera automatiquement les données et remplira la variable super globale $_SESSION.

Pour utiliser des sessions nommées, appelez la fonction session_name() avant d'appeler la fonction session_start().
Si l'option session.use_trans_sid est activée, la fonction session_start() enregistre un gestionnaire de sortie interne qui effectue la réécriture d'URL.

Remarque : Pour utiliser des sessions basées sur des cookies, la fonction session_start() doit être appelée avant le début de la sortie.

session_unset()

Détruisez les données de la session en cours. Ou $_SESSION = array(); Si vous souhaitez détruire les données de session individuelles, vous pouvez unset ($_SESSION['varname']);.

session_destroy()

est différent de session_unset() détruire toutes les données de session session_destroy() détruit la session. lui-même. Dès que la fonction se termine, la session en cours devient une poubelle, attendant que le mécanisme gc la recycle. Cependant, il ne réinitialise pas les variables globales associées à la session en cours, ni le cookie de session. Les données de session qui devraient être présentes sont toujours là, mais « l'identité » a changé. Si le gc ne l'a pas encore recyclé, il peut toujours être lu, ce qui bien sûr n'est pas quelque chose que vous voulez voir, vous devez donc souvent session_destroy() avant session_unset().

Si vous devez réutiliser la variable de session, vous devez appeler à nouveau la fonction session_start(). Afin de détruire complètement la session, par exemple lorsque l'utilisateur se déconnecte, l'ID de session doit également être réinitialisé. Si l'ID de session est transmis via un cookie, la fonction setcookie() doit également être appelée pour supprimer le cookie de session du client.

Les exemples suivants consistent à détruire les données elles-mêmes :

// 初始化会话。// 如果要使用会话,别忘了现在就调用:session_start();// 重置会话中的所有变量,销毁会话数据$_SESSION = array(); // 或者session_unset() // 如果要清理的更彻底,那么同时删除会话 cookie// 注意:这样不但销毁了会话中的数据,还同时销毁了会话本身if (ini_get("session.use_cookies")) {    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,        $params["path"], $params["domain"],        $params["secure"], $params["httponly"]
    );
}// 最后,销毁会话session_destroy();

Détruire les données de session$_SESSION = array() ou session_unset() ; détruire la session elle-mêmesession_destroy() et setcookie() ; session_destroy()Après exécution, la session devient une session poubelle, en attente de recyclage par le mécanisme gc.

session_commit()

session_commit() est un alias pour session_write_close(). Contrairement à session_start, il s'agit de écriture et de clôture . Autrement dit, enregistrez les données de la session en cours et fermez la session en cours. Afin d'éviter l'écriture simultanée de sessions, un seul script PHP est autorisé à gérer la session à tout moment. Par conséquent, une fois qu'un script session_start ouvre la session, aucun autre script ne peut être utilisé jusqu'à ce que le script soit terminé ou que session_write_close() soit terminé. séance convoquée. Par défaut, la session sera automatiquement écrite et fermée à la fin du script. Cependant, lorsque le temps d'exécution du script est relativement long, le script occupera systématiquement le verrou, rendant les autres scripts incapables d'utiliser la session, provoquant ainsi de nombreuses erreurs. Par conséquent, la meilleure pratique est que si des variables ou des données de session changent (telles que $_SESSION[xx] = xxx), vous devez utiliser session_commit() pour enregistrer les données et fermer la session en temps opportun.

session_id ()

session_id() peut être utilisé pour obtenir/définir l'ID de session en cours. Pour ajouter facilement un ID de session à une URL, vous pouvez utiliser le SID constant pour obtenir le nom et l'ID de session au format chaîne. Pour faire simple, si vous activez la méthode POST/GET pour obtenir l'ID de session, alors ce paramètre peut être défini via session.use_trans_sid et visible dans l'URL, et peut être obtenu directement via la variable globale SID dans le script.

//配置ini_set('session.use_trans_sid', 'sid');//url中表现127.0.0.1?sid=xxxxx//直接获取$sid = SID;

Si la valeur du paramètre session_id () est spécifiée, utilisez la valeur spécifiée comme ID de session. La fonction session_start() doit être appelée avant la fonction session_id(). Différents gestionnaires de sessions ont des restrictions différentes sur les caractères pouvant être utilisés dans les ID de session. S'il n'y a pas de session en cours, une chaîne vide ("") est renvoyée.

Il y a deux points à noter ici :

  • Si vous utilisez des cookies pour transmettre l'ID de session et spécifiez le paramètre id, après avoir appelé session_start(), il sera envoyé au client Envoyer un nouveau cookie, que l'ID de session actuel et l'ID de session nouvellement spécifié soient identiques ou non

  • Avant de changer l'ID de session actuel via session_id ($id), il doit être fermé via session_commit() La session précédente, sinon la session en cours restera l'originale

Pour plus de fonctions, veuillez vous référer au site officiel ou au manuel PHP.

我们在前面的文章里面讲到session的原理和最佳实践,感到意犹未尽。现在再来聊下PHP Session用到的几个相关的函数。

session_start()

session_start() 会创建新会话或者重用现有会话。 如果通过 GET 或者 POST 方式,或者使用 cookie 提交了会话 ID, 则会重用现有会话。

当会话自动开始或者通过 session_start() 手动开始的时候, PHP 内部会调用会话管理器的 open 和 read 回调函数。 会话管理器可能是 PHP 默认的, 也可能是扩展提供的(SQLite 或者 Memcached 扩展), 也可能是通过 session_set_save_handler() 设定的用户自定义会话管理器。 通过 read 回调函数返回的现有会话数据(使用特殊的序列化格式存储), PHP 会自动反序列化数据并且填充 $_SESSION 超级全局变量。

要想使用命名会话,请在调用 session_start() 函数 之前调用 session_name() 函数。  
如果启用了 session.use_trans_sid 选项, session_start() 函数会注册一个内部输出管理器, 该输出管理器完成 URL 重写的工作。

注意:要使用基于 cookie 的会话, 必须在输出开始之前调用 session_start() 函数。

session_unset()

销毁当前会话数据。或者$_SESSION = array(); 如果要销毁个别会话数据,可以unset ($_SESSION['varname']);.

session_destroy()

session_unset()销毁所有会话数据不同,session_destroy()销毁的是会话本身,此函数一出,当前session就变成垃圾了,等待gc机制去回收它。但是它并不会重置当前会话所关联的全局变量, 也不会重置会话 cookie。该有的会话数据还是在,只不过“身份”变了而已。如果gc尚且还没有去回收它,那么它仍然是可以读取到的,这当然是不愿意看到的,因此在session_destroy() 之前往往还要session_unset()一下。

如果需要再次使用会话变量, 必须重新调用 session_start() 函数。 为了彻底销毁会话,比如在用户退出登录的时候,必须同时重置会话 ID。 如果是通过 cookie 方式传送会话 ID 的,那么同时也需要 调用 setcookie() 函数来 删除客户端的会话 cookie。

下面例子是销毁数据本身:

// 初始化会话。// 如果要使用会话,别忘了现在就调用:session_start();// 重置会话中的所有变量,销毁会话数据$_SESSION = array(); // 或者session_unset() // 如果要清理的更彻底,那么同时删除会话 cookie// 注意:这样不但销毁了会话中的数据,还同时销毁了会话本身if (ini_get("session.use_cookies")) {    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,        $params["path"], $params["domain"],        $params["secure"], $params["httponly"]
    );
}// 最后,销毁会话session_destroy();

销毁会话数据$_SESSION = array()session_unset() ;销毁会话本身session_destroy();和setcookie()session_destroy()执行后会话就变成垃圾会话,等待gc机制回收。

session_commit()

session_commit()session_write_close()别称。和session_start相反,这是关闭。即保存当前session数据,并且关闭当前会话。为了防止并发的写session,任何时刻只能允许有一个PHP脚本在操作session,因此,一个脚本一旦session_start打开session,那么在此脚本终止或者调用session_write_close()之前,别的任何脚本都不能使用session。在默认情况下脚本结束时会自动写入和关闭session,但是在脚本执行时间比较长的时候,此脚本就一致占据锁使得别的脚本无法使用session,因此导致许多错误。因此,最佳实践是,任何session变量,数据的更改(如$_SESSION[xx] = xxx),都要及时使用session_commit()保存数据,关闭会话。

session_id ()

session_id() 可以用来获取/设置 当前会话 ID。 为了能够将会话 ID 很方便的附加到 URL 之后, 你可以使用常量 SID 获取以字符串格式表达的会话名称和 ID。简单说,就是如果你开启的是POST/GET方式获取会话ID,那么这个参数可以通过session.use_trans_sid设定并在URL中看得见,而在脚本中通过全局变量SID来直接获取。

//配置ini_set('session.use_trans_sid', 'sid');//url中表现127.0.0.1?sid=xxxxx//直接获取$sid = SID;

如果指定了 session_id () 参数的值, 则使用指定值作为会话 ID。 必须在调用 session_start() 函数之前调用 session_id() 函数。不同的会话管理器对于会话 ID 中可以使用的字符有不同的限制。  如果当前没有会话,则返回空字符串(”“)。

这里有两点值得注意下:

  • 如果使用 cookie 方式传送会话 ID,并且指定了 id 参数, 在调用 session_start() 之后都会向客户端发送新的 cookie, 无论当前的会话 ID 和新指定的会话 ID 是否相同

  • Avant de changer l'ID de session en cours via session_id ($id), vous devez fermer la session précédente via session_commit(), sinon la session en cours restera l'originale

Pour plus de fonctions, veuillez vous référer au site officiel ou au manuel PHP.

Recommandations associées :

Explication détaillée de la session partagée Redis

Explication détaillée du verrouillage de session, de la concurrence et de la couverture en PHP

Partage de code de temps de stockage de survie de session de modification 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