首页 > 解决方案 > PHP - session_write_close() - 跨页面传递 $_SESSION 变量

问题描述

我的目标是在不打开会话的情况下将消息传递到另一个页面,因为这会干扰其他脚本。

假设我在一页上有一个表单流程:

<?php

if ( process_form() ) {

    session_start();
    $_SESSION['success'] = 'The form has been saved.';
    session_write_close();
    header( 'Location: http://www.example.com/success.php' );
    exit();
    

} else {

    // Do something

}

?>

在第二页上,我尝试获取 $_SESSION 变量的内容:

<?php
// success.php

var_dump( $_SESSION ); // 1

session_start();

var_dump( $_SESSION ); // 2

session_write_close();

var_dump( $_SESSION ); // 3

?>

输出是:

  1. 未定义的变量:_SESSION
  1. array(1) { ["success"]=> string(24) "表单已保存。" }
  1. array(1) { ["success"]=> string(24) "表单已保存。" }

为什么不先打开会话就不能读取 _SESSION 变量?

基本上在第二页上,我只想从会话中读取数据而不是将其打开,这是最好的方法吗?:

<?php
// success.php

session_start();
session_write_close();
echo $_SESSION['success'];

?>

输出是:

表格已保存。

标签: phpsessionredirect

解决方案


当 PHP 脚本结束时,会话被存储并关闭。在您的第一部分代码中,位于exit();. 只有在 PHP 脚本的输出被发送到浏览器后,它才会响应header();并加载另一个页面。会议已经结束。这意味着session_write_close();,在那段代码中,没有任何用途,或者至少没有按照您的预期去做。

你的问题是:

为什么不先打开会话就不能读取 _SESSION 变量?

最可能的答案是您没有启用自动会话启动功能。

请参阅:session.auto_start

而且您可能不需要强制关闭会话,session_write_close();因为这是在 PHP 完成脚本处理时完成的。


推荐阅读