通过阅读session_unset()和session_destroy(),我发现destroy
无法清除变量等等。
为什么下面的代码没有清理$_SESSION
超级全局,它应该通过它的文档?
此行为是否记录在何处?
要重现的片段:
#!/usr/bin/php
<?php
session_start();
$_SESSION['x'] = 1;
// If you uncomment this, `session_unset` works as intended.
session_destroy();
// It doesn't matter if you call unset, it won't have any effect
// as session_destroy was called.
session_unset();
fwrite(STDERR, var_export($_SESSION, true));
// prints: array ('x' => 1), even though session_unset was called
答案 0 :(得分:0)
因为session_destroy()将删除与该用户相关的所有会话。 here document
答案 1 :(得分:0)
我认为这种行为与默认会话驱动程序的实现有关。 (见here)。
当调用session_destroy
时,PHP触发会话类处理程序的destroy
方法。也许它只破坏数据而不触及$_SESSION
,当调用session_unset
时,它会验证每个$_SESSION
项目,如果项目的密钥是持久的,它会删除它,如果没有,它会删除它什么都没有。
最后,当您首先致电session_destroy
时,所有数据都会被销毁,因此session_unset
在$_SESSION[$key]
未被保留的情况下无法执行任何操作。
<?php
foreach($_SESSION as $key=>$value)
{
global $data_persisted; //fictive variable containing persisted datas as array
if(isset($data_persisted[$key])
{
unset($_SESSION[$key]);
}
}
最后,在session_destroy
和session_unset
各自通话后,$_SESSION
仍然会有自己的数据。