无法访问会话数据session_write_close

时间:2019-10-20 07:06:13

标签: php

我遇到了会话文件被锁定的问题,因此一旦完成会话,便添加了session_write_close()。在此之前,脚本可以正常运行,但是,一旦我现在离开登录页面,会话将为空白。

会话从index.php的顶部开始,其中包括登录页面:

$result = 'token_valid';
$_SESSION['user'] = $email;
print_r($_SESSION);
session_write_close();
print_r($_SESSION);

在登录页面上两次都正确返回了会话数据。

Array ( [user] => abc@gmail.com ) Array ( [user] => abc@gmail.com )

链接返回首页,该页面调用一个函数以检查是否已登录...

function user_is_signed_in() {
    print_r($_SESSION);
    session_write_close();

    if($user == '') {
        return False;
    }
    else {
        return True;
    }

}

会话不再有任何数据。

完整的index.php

<?php 

session_start();

include_once('fnc/database.php');
include_once('fnc/user.php');

if(!user_is_signed_in()) {
  include('sign-in.php');
}
else {
  $url = parse_url($_SERVER['REQUEST_URI']);
  if(!$url['query'])
  {
    include('home.php');
  }
  else {
    if(isset($_GET['media']))
    {
      include($_GET['media'].'.php');
    }
    if(isset($_GET['user']))
    {
      include($_GET['user'].'.php');
    }

  }

}

解决方法(可能是肮脏的)

问题似乎是由实际会话文件的读取/写入引起的。使用了PHP生成的session_id,并刚刚创建了一个辅助会话文件。不要保存在同一文件夹中(或者,如果要更改文件名,则不要更改文件名)-session_start似乎会删除并重新生成PHP管理的会话文件,您将丢失写在其中的任何数据。

session_start();
$sess = array();
$sess = $_SESSION;
$sess["id"] = session_id();
//print_r($sess);
session_write_close();

在会话文件夹中创建session_data

        $session_details = "user|".$email;

        $session_file = "/Programs/XAMPP/tmp/session_data/sess_".$sess["id"];
        //echo $session_details;

        $fh = fopen($session_file, 'w+');
        fwrite($fh, $session_details);
        fclose($fh);

从此文件而不是会话中读取会话数据

    $session_path = "/Programs/XAMPP/tmp/session_data/sess_".$sess["id"];
    $fh = fopen($session_path, 'r');
    $session_file = fread($fh, filesize($session_path));

    $exploded_session = explode("\n", $session_file);

    $session_data = array();

    foreach($exploded_session as $line)
    {
        $tmp = explode("|", $line);
        $session_data[$tmp[0]] = $tmp[1];
    }

    return $session_data["user"];

    fclose($fh);

0 个答案:

没有答案