[英]$_SESSION is empty after reloading page
我的脚本test.php
如下。 当我单击Submit时,它会将其作为登录尝试进行处理,并成功设置$_SESSION
变量。 但是当我重新加载页面时(通过单击链接回自身), $_SESSION
为空。
<?php
//test.php
session_start ();
function isUserLoggedIn (&$username)
{
$loggedIn = isset ($_SESSION['loggedin']);
if ($loggedIn)
$username = $_SESSION['user'];
else
$username = '';
return $loggedIn;
}
function processLogin ()
{
$_SESSION['loggedin'] = TRUE;
$_SESSION['user'] = "podunk";
session_write_close ();
}
echo '$_SESSION before we do anything..................: ';
print_r ($_SESSION);
echo "<br>";
if (isset($_POST['Submit'])) processLogin ();
$loggedIn = isUserLoggedIn ($username);
echo '$_SESSION after processing any login attempt: ';
print_r ($_SESSION);
echo "<br>";
if ($loggedIn)
echo "I AM LOGGED IN as $username!";
else
echo "I am logged out :(";
?>
<html>
<body>
<form name="form1" method="post" action="test.php">
<input type="submit" name="Submit" value="Login">
</form>
<a href="test.php">Reload page</a>
</body>
</html>
这是我在Linux apache2服务器上运行它的时候。 当我在XAMPP上运行它时,$ _SESSION仍然存在并且用户仍然登录。所以我猜它与php.ini有关......但也许我在这里犯了一个错误并且XAMPP正在原谅。
Linux服务器成功运行WordPress,所以它的设置不能太奇怪。 刚刚按照建议进行了系统升级。 session.save_path存在并且今天有一些日期,所以我认为它有效,虽然它由root拥有而不是www-data,所以IDK如果这是一个问题。
这里有一些来自php信息的其他东西。 关于那个cookie_path的IDK,所以我把它改成了session.save_path,FWIW所在的地方。
session.auto_start On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_httponly Off Off
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
使用Chrome,Firefox和IE的行为是相同的。
TIA。
你的脚本流程基本上就是这样
start the session
run processLogin();
run isUserLoggedIn()
但是,在您的processLogin()
您使用session_write_close()
强制关闭会话,因此当您到达isUserLoggedIn()
并查询会话的内容(现在已关闭)时,您似乎没有登录。
尝试运行代码而不强制关闭会话。
我不得不说我会问为什么这似乎适用于你的某个环境!
似乎有两个问题:
1)您的session.save_path不可写。 根据您的评论,我已经解决了这个问题。 无论如何,尝试将此设置在您的脚本之上,只是为了确保:
ini_set('session.save_path', '/tmp');
2)你将session.cookie_path与session.save_path混淆,这两个设置完全不同。 将session.cookie_path设置为/ ,这是指您的网址路径 。
ini_set('session.cookie_path', '/');
如何在unix 中使会话目录可写
chown www-data:www-data /tmp/sessions
ini_set('session.save_path', '/tmp/sessions');
最后,检查该文件夹中的所有者会话文件。
我确信您正在关闭会话然后调用函数。
使用session_write_close
- 您编写会话数据并结束会话
尝试使用session_is_registered
- 查明全局变量是否在会话中注册而不是session_write_close
以便您可以查看此数据是否已在您的服务器上注册。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.