我遇到了会话文件被锁定的问题,因此一旦完成会话,便添加了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);