【问题标题】:session_status() returns none on reloadsession_status() 重新加载时不返回
【发布时间】:2021-08-05 21:29:22
【问题描述】:

我已经看到this identical opposite 问题,它的 OP 代码示例对我来说似乎非常好。我还阅读了(包括 PHP 文档)可以在 PHP >= 5.4 上使用 session_status() 检查会话,在调用 session_start() 以确定它是否已经存在之前这样做应该没问题。

现在,我在 CentOS 7.10 机器上使用 PHP 5.4.16,session_status() 总是为我返回 1 (PHP_SESSION_NONE),只有当我用这个示例重新加载页面时:

<?php
$status = session_status();
session_start();
echo "The session status is : $status";

我希望它在我重新加载页面时返回PHP_SESSION_ACTIVE (2)(并且我不会在清除缓存的情况下强制重新加载)。我正在使用最新的 Chrome 版本,并且该页面嵌入在具有 HTTPS 端口 8443 的虚拟主机中。

我已经使用php --versionphpinfo() 脚本检查了PHP 版本以丢弃任何版本冲突以防万一,它们是相同的。此外,当我访问会话脚本页面时,服务器会在 /var/lib/php/session 目录中创建空文件。我没有更改会话或任何东西的默认 PHP 设置。

明确一点:session_status() 工作正常,如果在相同的脚本执行 (The session status is : 2) 之后检查,但我自然对此不感兴趣,因为我想首先检查会话是否存在。

可能出了什么问题?

【问题讨论】:

  • 所以你说当你重新加载你的会话丢失了??
  • 危险:PHP 5.4 一直不受支持,并且已经有五年多没有得到安全更新了。 5.4.16 来自 2013 年 5 月和packed with vulnerabilities。尽快升级吧!
  • PHP_SESSION_NONE if sessions are enabled, but none exists. 来自文档,对我来说,我可能错了,您的配置启用了会话,因此您没有得到0 (PHP_SESSION_DISABLED),但您的会话尚未开始。所以你会得到一个PHP_SESSION_NONE 作为结果。
  • 您在开始会话之前获取状态。为什么在那一点上除了“无”之外什么都不是?该函数为您提供当前请求的当前状态。

标签: php session php-5.4


【解决方案1】:

在您在当前请求的生命周期内调用 session_start 之前,您的 session_status 将始终为 PHP_SESSION_NONE。如果您在之前的某个请求中“已经启动”了一个会话,这并不重要:您需要“重新启动”它,以恢复之前启动的会话。这是通过 cookie 完成的。

如果您的意图是仅在用户过去已经做过启动会话的某些操作(例如,他们之前已经登录)并且您想要恢复会话但不开始新会话时才开始会话,那么您可以简单地检查if (isset($_COOKIE['PHPSESSID']))

如果您知道大多数用户不需要会话,并且您希望避免 cookie 和会话涉及的开销,但仍然能够处理需要会话的情况,这可能会有所帮助。

【讨论】:

  • 谢谢,就是这样。主要问题是我假设以前的会话在您重新加载页面时立即可用。我认为相反的情况并不明显。
【解决方案2】:

根据我的经验,session_status() 只允许您知道会话是否已启动,因此是否在当前脚本中调用了 session_start()。

  • PHP_SESSION_DISABLED 我认为如果在 PHP 配置中禁用会话,则会返回此信息。
  • 如果当前脚本中没有启动会话,则返回 PHP_SESSION_NONE
  • 如果会话已在当前脚本中启动,则为 PHP_SESSION_ACTIVE。

这篇文章可能会让你感兴趣https://stackoverflow.com/questions/32356373/how-to-disable-session-in-php#:~:text=You%20can%20disable%20the%20session,ini%20

一种检查会话是否已在不同脚本中启动的方法是


<?php

session_start();

if (!isset($_SESSION['init'])) {
   echo 'first time session';
   $_SESSION['init'] = true;
}


【讨论】:

    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2021-09-26
    相关资源
    最近更新 更多