PHP session_start() 函数:为啥我每次使用与 PHP 会话相关的任何东西时都需要它
Posted
技术标签:
【中文标题】PHP session_start() 函数:为啥我每次使用与 PHP 会话相关的任何东西时都需要它【英文标题】:PHP session_start() function: Why I need it everytime I use anything related to PHP sessionsPHP session_start() 函数:为什么我每次使用与 PHP 会话相关的任何东西时都需要它 【发布时间】:2011-08-12 09:25:02 【问题描述】:为了从我的网站注销用户,我将页面重定向到logout.php
,我正在使用 session_destroy() 函数。即使在那里,如果没有session_start()
功能,注销功能也不起作用。通过在session_destroy()
函数之前添加 session_start() 函数,我可以成功注销用户。
为什么我每次都需要在每个页面中使用session_start()
函数?
【问题讨论】:
【参考方案1】:session_destroy() 销毁活动会话。如果不初始化会话,则不会有任何东西被销毁。
【讨论】:
那么,我是否需要在只有登录用户才能看到页面的每个页面上初始化会话?我想通过调用 session_start() 每个页面都知道有一个会话变量集。 当然。如果您曾经在请求中处理会话,则需要调用 session_start() 以向 PHP 提供会话信息。 或者您可以使用 session.auto_start = 1 (这不是最佳做法,但有可能 =)【参考方案2】:为什么我每次都需要在我正在做与会话相关的事情的每个页面中使用 session_start() 函数?
所以 PHP 知道要销毁哪个会话。 session_start()
查看是否存在会话 cookie 或 ID。只有有了这些信息,你才能摧毁它。
【讨论】:
感谢佩卡的回答。我可以创建多个会话吗?例如,我调用 session_start() 函数 4 次。它创建 4 个会话? 您可能只创建一个会话。在您调用第一个 session_start() 之后,除非您为后续 session_start() 调用指定不同的会话 id,否则它默认为原始会话 id(存储在用户 cookie 或 url 中)。 @iSumitG @John 说了什么。我认为多次启动会话甚至会引发错误 - 首先它没有意义 @Pekka,您一次只能运行一个会话,对。但是,您可以通过在session_start
之前强制会话 ID 为用户启动、维护和保存到单个站点上的多个会话。这方面的示例可能是站点/论坛会话与购物车会话。
如果你想变得可笑,你甚至可以玩弄(理论上):P【参考方案3】:
在默认配置中,PHP 会话在硬盘之外运行。 PHP 要求您在需要此支持时明确告知它,以避免不必要的磁盘 IO。
session_start()
还告诉 PHP 找出用户的会话是否存在。
【讨论】:
【参考方案4】:session_start() 创建一个会话或 根据 a 恢复当前的 通过 GET 传递的会话标识符或 POST 请求,或通过 cookie 传递。
根据http://php.net/manual/en/function.session-start.php
基本上通过调用session_start()
,PHP 读取标头并将会话 ID 交叉引用到您系统上的内容(文件系统/数据库/等),然后可以填充与该特定用户相关的 $_SESSION
.这反过来又允许您调用session_destroy()
,因为它知道要实际销毁的会话。
【讨论】:
【参考方案5】:考虑使用 session_start() 作为告诉 php 引擎....您想要使用会话的方式。
并且,据我所知,始终将其作为 php 页面中的第一行。
【讨论】:
【参考方案6】:我对 session_start() 的用法感到困惑;每次我使用会话变量时,我都在调用 session_start。准确地说,我有 session_start();在每个页面上不止一次(甚至没有调用 session_destroy())。例如,
// 1st call
session_start();
if (!isset($_SESSION['UserID']))
// Do something
else
// Do something else
// .... some other code
// 2nd call
session_start();
if (!isset($_SESSION['UserID']))
// Do something totally different
else
// Do something else totally different
这给我带来了性能问题。所以我最终只在页面顶部调用了一次session_start();
,一切似乎都运行良好。
【讨论】:
【参考方案7】:您必须在您希望会话工作的每个文件中调用 session_start 一次(且仅一次)。
允许您只调用一次的常用方法是将调度程序文件作为 index.php;在此处调用 session_start 并让此页面根据 url 的 $_GET 包含其他页面。
<?php
session_start();
if(isset($_GET['page']) && file_exists('pages/'.$_GET['page'].'.php')
include $_GET['page'];
?>
//www.mysite.com/index.php?page=fish will display /pages/fish.php with session access
【讨论】:
以上是关于PHP session_start() 函数:为啥我每次使用与 PHP 会话相关的任何东西时都需要它的主要内容,如果未能解决你的问题,请参考以下文章
PHP session_set_cookie_params 中断 php session_start() 函数和 $_SESSION 变量
Laravel5为啥设置session的lifetime时间就是没有用的