php - 无法访问会话数据 session_write_close
问题描述
我遇到了会话文件被锁定的问题,所以我在完成会话后添加了 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);
解决方案
推荐阅读
- python - 如何将常用值分组为 2 列?
- c# - 从 UWP 中的代码设置 RichEditBox 的 FontFamily
- javascript - 我被要求为 WordPress 网站编写脚本。我可以用 HTML 和 Javascript 编写代码并让他将其粘贴到某个地方吗?
- vba - 如何在Word中的两个自定义字符串之间提取内容并粘贴到最后
- unity3d - Unity Oculus Quest 第一人称控制器
- javascript - 验证表单输入,然后单击启动 ajax 请求
- stata - 过滤字符串变量
- tensorflow - 使用简单的 rnn 预测指数加权平均值
- spring - 将列表插入单独的表 MYBATIS
- c - 如何在c中将相对url转换为绝对url