会话在一个地方设置但不在另一个地方设置的奇怪问题


Strange issue with session getting set in one place but not in another

我有两个用于更新帐户的php页面,一个前端和一个后端。

前端(重要部分):

<?php
  session_cache_limiter('none');
  session_start(); //session gets started
  include_once 'includes/db_connection.php';
  include_once 'includes/signin.php'; //file that deals with login and creates the session variables
  include_once 'includes/updateaccount_process.php'; //back end file
?>

后端(重要部分):

<?php
  include_once 'db_connection.php';
  include_once 'signin.php';
?>

如果我将session_start()添加到后端文件,我会收到一条通知,指出会话已启动。如果我不添加session_start()则由于对会话变量的依赖,php 脚本的其余部分将无法正确执行。

如果我添加if(!isset($_SESSION)) { session_start(); },它工作得很好,我没有得到任何通知,但我不明白为什么。

希望有人能帮忙。

谢谢。

虽然PHP可以生成前端内容,但PHP驻留在后端,即您有两个服务器端文件。 如果您的第一个 PHP 文件启动了一个会话,只要您的代码不会破坏或以其他方式禁用该会话,只要您的浏览器保持打开状态,该会话就应该存在。 当您转到另一个 PHP 页面时,如果您运行以下代码:

(!isset($_SESSION)) { session_start()

它将检查启动新会话是否有意义。 如果会话不再存在,则会创建一个新会话。 运行 session_start() 而不检查先前设置的会话将导致如果会话仍然有效,则会出现以下错误消息:

注意:会话已启动

然后,此附加 session_start() 应恢复当前会话。

发生会话问题可能还有其他原因。如果您使用的是 PHP5.4 或更高版本,则可以调用 session_status(),其返回值可以指示会话是否已禁用或不存在。 它还可以确认当前是否处于活动状态(请参阅手册)。

顺便说一下,设计session_status()的核心贡献者主要关心的是为用户提供一种检查当前是否存在活动会话的方法。(请参阅错误报告。

在您指定为"后端"的页面上,我建议按如下方式重做代码:

<?php
     if (!isset($_SESSION)) || (session_status() !== PHP_SESSION_ACTIVE) ) {
             session_start();
     }
     include_once('signin.php');
     include_once('db_connection.php');

您可以考虑移动include_once("signin.php")并将其作为 session_start() 后面的语句放在 if 条件块中,只要包含的文件仅创建会话变量并且以前的代码没有取消设置它们。

最后一点,你可能希望使用 include() 而不是 include_once(),如果你的两个页面实际上只包含每个文件一次。 Include_once() 比 include() 慢。仅当脚本包含会导致尝试在脚本中多次包含文件的代码时,才应使用 include_once(请参阅此处)。