在 php5.3 > php5.5.9 升级后,访问 php class 对象中的会话变量失败

Accessing a session variables in a php class object fails after php5.3 > php5.5.9 upgrade

对象和会话属性不会从 class 函数返回到启动脚本中,即使 classes 和对象启动。我可以从 class 函数中使用 var_dump() 查看它们的属性,但它们不会在 class 函数之外返回。

我有一个全局包含的文件 global.inc.php,它在每个页面上都会被调用,它会做很多事情。在用户表单登录上,包含调用自定义 class ('UserTools.class.php') 使用:

$userTools = new UserTools();

这个 class 做了 3 件事:

  1. 数据库检查用户(一些密码 verification/hashing 稍后出现 - 此处省略):

public function login($username, $password) {
$result = mysql_query("SELECT * FROM users WHERE username = '$username'");
$row = mysql_fetch_assoc($result);

  1. 设置一堆 $_SESSION 变量(session_start() 已经从 global.inc.php 调用)

$_SESSION["login_time"] = time();
$_SESSION["logged_in"] = true;
$_SESSION["passwordHash"] = $passwordHash;

  1. 初始化用户class并将用户对象序列化到会话变量$_SESSION['user']:

$_SESSION["user"] = serialize(new User($row));

如果我 var_dump($_SESSION['user']) 从 "within" 到 class,我可以看到用户对象的序列化字符串表示:

var_dump($_SESSION['user']):

array (size=4)
'SESS_PARENT' => boolean true
'SESS_CHILD' => boolean true
'timezone' => int 300
'user' => string 'O:4:"User":13: {s:2:"id";s:1:"1";s:8:"username";s:5:"peter";s:14:"hashedPassword";s:60:"y.....(length=6160)

问题
但是当class函数returns调用global.in.php脚本时,完整的$_SESSION变量是:

array (size=0) . empty

Q1。我在这里做错了什么?

Q2。自 php 5.3 以来发生了什么变化才能产生这种效果?

Session_start()

罪魁祸首原来是 $_SESSION 超全局和一组复杂的包含。

session_start(); 不在包含文件的开头,只是在一些 ini_set 命令为 $_SESSION 超全局设置各种参数之后的某个地方。

Header 重定向

Header 重定向未保存 session 数据。 这是因为,对 $_SESSION 变量的任何更改都是在脚本结束时进行的。使用 exit() 语句的 header 重定向本质上是中断脚本的执行 - 因此 session 需要写回磁盘、数据库或 Redis 'before' redirect 和 exit() 命令被调用。