PHP使用session_write_close跨页传递$_SESSION变量相关问题咨询
问题解答
疑问1:未先行开启会话时无法读取$_SESSION变量的原因
$_SESSION属于PHP的超全局变量,但并不会自动初始化,必须通过session_start()触发会话加载流程后才可以访问session_start()会完成以下核心操作:匹配客户端携带的会话ID,读取对应服务端存储的会话数据,将数据反序列化后填充到$_SESSION数组中,此时该变量才会被正式创建- 你示例代码中第一个
var_dump($_SESSION)执行时还未调用session_start(),$_SESSION数组尚未被创建,因此会抛出未定义变量的错误 - 额外说明:
session_write_close()仅会关闭会话的写入权限、释放会话锁,已经加载到内存中的$_SESSION数组仍然可以正常读取,这也是你第三个var_dump能够正常输出的原因
疑问2:仅读取会话数据时的写法是否最优
你给出的写法是完全可用且符合需求的:调用session_start()加载会话数据后立刻执行session_write_close(),会提前释放会话锁,不会阻塞同会话下的其他请求执行,满足你“不保持会话开启避免干扰其他脚本”的要求。
如果你的运行环境支持PHP 7.2及以上版本,还有更简洁的最优实现:
<?php // success.php // 传入read_and_close参数,读取会话数据完成后自动关闭会话,无需手动调用session_write_close() session_start(['read_and_close' => true]); echo $_SESSION['success']; ?>
该写法与你原本的写法效果完全一致,代码更简洁,也避免了遗漏调用session_write_close()的潜在问题。
内容的提问来源于stack exchange,提问作者Nathan Duckett
相关产品推荐
相关产品推荐

