【发布时间】:2011-08-12 09:25:02
【问题描述】:
为了从我的网站注销用户,我将页面重定向到logout.php,我正在使用 session_destroy() 函数。即使在那里,如果没有session_start() 功能,注销功能也不起作用。通过在session_destroy() 函数之前添加 session_start() 函数,我可以成功注销用户。
为什么我每次都需要在每个页面中使用session_start() 函数?
【问题讨论】:
为了从我的网站注销用户,我将页面重定向到logout.php,我正在使用 session_destroy() 函数。即使在那里,如果没有session_start() 功能,注销功能也不起作用。通过在session_destroy() 函数之前添加 session_start() 函数,我可以成功注销用户。
为什么我每次都需要在每个页面中使用session_start() 函数?
【问题讨论】:
session_destroy() 销毁活动会话。如果不初始化会话,则不会有任何东西被销毁。
【讨论】:
为什么我每次都需要在我正在做与会话相关的事情的每个页面中使用 session_start() 函数?
所以 PHP 知道要销毁哪个会话。 session_start() 查看是否存在会话 cookie 或 ID。只有有了这些信息,你才能摧毁它。
【讨论】:
session_start 之前强制会话 ID 为用户启动、维护和保存到单个站点上的多个会话。这方面的示例可能是站点/论坛会话与购物车会话。
在默认配置中,PHP 会话在硬盘之外运行。 PHP 要求您在需要此支持时明确告知它,以避免不必要的磁盘 IO。
session_start() 还告诉 PHP 找出用户的会话是否存在。
【讨论】:
session_start() 创建一个会话或 根据 a 恢复当前的 通过 GET 传递的会话标识符或 POST 请求,或通过 cookie 传递。
根据http://php.net/manual/en/function.session-start.php
基本上通过调用session_start(),PHP 读取标头并将会话 ID 交叉引用到您系统上的内容(文件系统/数据库/等),然后可以填充与该特定用户相关的 $_SESSION .这反过来又允许您调用session_destroy(),因为它知道要实际销毁的会话。
【讨论】:
考虑使用 session_start() 作为告诉 php 引擎....您想要使用会话的方式。
并且,据我所知,始终将其作为 php 页面中的第一行。
【讨论】:
我对 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();,一切似乎都运行良好。
【讨论】:
您必须在您希望会话工作的每个文件中调用 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
【讨论】: