我有以下基本的注销脚本,我认为它的功能很奇怪:
<?php
session_start();
$_SESSION['customerState'] = array("abbr"=>"TX","full"=>"Texas");
$_SESSION['agent']['url'] = "jmarston4";
$fart = isset($_SESSION['customerState']) ? $_SESSION['customerState'] : array();
$url = isset($_SESSION['agent']['url']) ? $_SESSION['agent']['url'] : '';
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
echo "Fart1: ";
print_r($fart);
session_destroy();
echo "<br>Fart2: ";
print_r($fart);
session_start();
echo "<br>Fart3: ";
print_r($fart);
$_SESSION['fart'] = $fart;
echo "<br>Fart4: ";
print_r($_SESSION['fart']);
#exit;
header('Location: https://'. $_SERVER['HTTP_HOST'] . '/' .$url);
此页面使用引用 URL(称为 $url)重定向到站点主页 (index.php)。这可以正常工作。为了测试起见,这里是 index.php 上所有代码的屏幕截图:
如果我允许exit;
处理,以下内容将输出到屏幕:
Dart1: Array ( [abbr] => TX [full] => Texas )
Fart2:数组([缩写] => TX [完整] => 德克萨斯)
Dart3: 数组 ( [abbr] => TX [full] => Texas )
Dart4: Array ( [abbr] => TX [full] => Texas )
(或视觉:http: //imgur.com/A6WuRfx)
在这个脚本 (logout.php) 中,我想从客户会话中保留一个 SESSION 变量(而不是手动取消设置 100 多个其他变量),以便我可以将其传递回主页以供内部使用。为此,脚本执行以下操作:
- 设置 SESSION 变量 'fart' 等于一个数组
- 然后在整个 SESSION 被销毁之前将局部变量设置为等于 SESSION 'fart'
- 会话数据被清除
- 会话 cookie 被删除
- 会话被破坏
- SESSION 'fart' 被创建并设置回 $fart 数组
- 页面重定向到主页。
问题
按照设计,PHP SESSIONS 是否应该以这种方式运行?如果是这样,一个人怎么能从本质上破坏会话(例如出于注销目的),同时维护在该用户会话期间收集的会话信息。
注意:我使用的是 SESSION 数组,因此出于 GET 目的传入 URL 不适用于此处。
更新说明:
我将这个问题的标题从“PHP 会话的行为是否符合规范?”
所有这些都适用于脚本本身,但是,当我尝试访问主页上的 $_SESSION['fart'] 时,它没有设置。我可以随时在页面上设置、操作或更改 SESSION 变量,包括在
session_destroy()
调用之后。例如,如果我想执行以下操作:... session_destroy()
$_SESSION['eatmyshorts'] = "你好!";
回声 $_SESSION['eatmyshorts']; // 将显示你好!……
但是,一旦脚本(页面)结束,与会话相关的任何内容(即使
$_SESSION['eatmyshorts']
在这种情况下,在任何其他页面上都不可用并且被忽略。