session_status() returns none 重新加载

session_status() returns none on reload

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

现在,我在 CentOS 7.10 机器上使用 PHP 5.4.16 并且 session_status() 总是 returns 1 (PHP_SESSION_NONE) 对我来说,只有当我重新加载包含此示例的页面:

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

我希望在我重新加载页面时 returns PHP_SESSION_ACTIVE (2)(而且我不会在清除缓存的情况下强制重新加载)。我使用的是最新的 Chrome 版本,该页面嵌入在一个虚拟主机中,通过端口 8443 使用 HTTPS。

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

要说清楚:如果在同一脚本执行后检查 session_status(),则 session_status() 工作正常 (The session status is : 2),但自然我对此不感兴趣,因为我想检查会话是否存在第一名。

有什么问题吗?

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

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

这个post可能会让你感兴趣

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


<?php

session_start();

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


您的 session_status 将始终是 PHP_SESSION_NONE,直到您在当前请求的生命周期内调用 session_start。如果您根据之前的某个请求“已经开始”一个会话并不重要:您需要“re-start”它,以恢复之前开始的会话。这是通过 cookie 完成的。

如果您的目的是仅在用户过去已经执行过启动会话的操作(例如,他们之前已经登录)时才启动会话,并且您想恢复会话而不是启动新会话,那么你可以简单地检查 if (isset($_COOKIE['PHPSESSID'])).

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