Php 表现出突然行为的会话

Php 表现出突然行为的会话,php,session,cookies,logout,Php,Session,Cookies,Logout,我的php会话显示异常行为。情况: 用户登录(https://example.com)应用程序 会话cookie有效期设置为7天。(通过浏览器cookie生存期验证) 用户移动到另一个域(不带https) 当用户试图在某个时间后通过单击应用程序链接返回时,会话将被破坏 这种行为很突然。有时,它仍然有效 以下是我开始课程的方式: if(!$this->session_manager_issession_set()) { $this->set_ini_conf

我的
php
会话显示异常行为。情况:

  • 用户登录
    (https://example.com)
    应用程序
  • 会话cookie有效期设置为7天。(通过浏览器cookie生存期验证)
  • 用户移动到另一个域(不带https)
  • 当用户试图在某个时间后通过单击应用程序链接返回时,会话将被破坏
  • 这种行为很突然。有时,它仍然有效
以下是我开始课程的方式:

if(!$this->session_manager_issession_set()) {
            $this->set_ini_config();
            session_name($this->session_manager_name);
            session_set_cookie_params($this->session_cookie_life, "/"); //Required for browser cookie cleanup
}

session_start();

if(empty($_SESSION))
    {
        $output['status']   =   false;
    }
    else{
       // Fetch the variables
    }

public function session_manager_issession_set(){
        $output =   true;

        $session_status =   session_status();
        switch($session_status){
            case PHP_SESSION_ACTIVE :

            break;
            default:
                $output =   false;
        }

        return $output;
    }

private function set_ini_config(){
    $output =   true;

    ini_set('session.gc_probability', 1);   //If session expires then ensure that session is flushed and cleared at all instances
    ini_set('session.gc_divisor', 100);     //If session expires then ensure that session is flushed and cleared at all instances

    ini_set('session.gc_maxlifetime', 7*24*60*60);  //MAx life of session cookie
    ini_set('session.cookie_secure', true);

    return $output;
}

这可能是什么原因?我是否以错误的方式实现了会话?

正如您在问题和评论中提到的,用户不仅移动到了不同的域,而且完全移动到了不同的服务器(因此,对我们读者来说,从
http
https
的更改更有意义)
$\u SESSION
是保存在服务器上的超全局文件,因此更改服务器是销毁
$\u SESSION
值的最可能原因


事实上,它可能仍然存在,但由于您试图从其他服务器访问它,因此服务器找不到它,从而使您(或服务器)认为它已被销毁(因为它位于启动会话的原始服务器上)。这可以解释为什么它有时有效,有时无效,因为您可以在服务器之间切换,有时您会很幸运,并且位于最初创建会话的同一台服务器上。

请阅读有关会话的信息。cookie\u secure位于


这将您的会话cookie限制为仅安全(如此https)连接。在从https切换到http时导致会话丢失首先,您的函数
会话管理器会话集()
基本上检查会话是否未启动(
会话状态()!=PHP\u会话处于活动状态
),然后启动会话,忽略会话可能正在运行的事实

如果会话名称对您很重要,则必须强制执行该名称:

if ($this->session_manager_issession_set()) {
    // session has already started, but we haven't set a name for it!
    throw new Exception("Session started prematurely");
}

// all fine, session isn't running; continue with setup
$this->set_ini_config();
session_name($this->session_manager_name);
session_set_cookie_params($this->session_cookie_life, "/");
// and finally start the session
session_start();
由于
session.name
为存储会话ID的cookie设置了一个名称,并且您使用了一个非默认名称,因此我猜想有东西会在您启动会话之前启动会话,因此您无法看到与您之前启动的会话相关联的数据

另一种选择是保留所有代码,并且只删除一行代码

session_name($this->session_manager_name); 

如果有帮助,那么我必须是对的。

在检查任何会话检查参数之前, 从基础开始,比如简单开始

print_r($_SESSION);
这将简单地输出您在其中的会话变量,就像这样,您可以看到服务器是否记住会话及其变量

接下来,我想这里的一些答案是关于, 您检查会话是否已启动,但要检查会话是否仍处于活动状态(与此不同)

因此,如果您知道会话变量中的某个键始终存在,那么只需使用以下命令进行检查:

if(isset($_SESSION['your_key'])) {
// Your code if session has been made already
}
我知道这看起来太简单了,但是当你试图找出错误的时候,回到代码的基础并不一定是件坏事:)
因此,尝试一下这个方法,如果上述两种方法都适用于您,那么即使会话变量完好无损,您也使用了一些错误的错误语句……)

Rafael说您应该尝试用更简单的代码库重新创建并解决问题,这是正确的。您还应该检测代码,以了解浏览器返回的cookies

我是否以错误的方式执行了该会话


代码很难阅读,使用switch语句,无正当理由地重写系统配置,以及许多其他奇怪的事情。不仅如此,这是一个特别不寻常的用例,您应该要求会话长时间处于活动状态(“记住我”功能与会话非常不同)。一旦解决了会话持久性问题,您可能需要阅读一些PHP风格的标准,并访问codereview.stackexchange.com

尝试移动
会话_start()
到文件顶部,当您说“用户移动到另一个域”时,就在
之后,这意味着另一个web服务器,对吗?@eagleye,session\u name()需要在session\u start()之前调用@Webomatik它是在session\u start之前调用的!是的,它会移动到另一个webserver@Webomatik此外,它有时也能工作,
$\u会话
有时是空的。我不尝试从其他服务器访问会话,而是从创建会话的同一服务器访问会话。用户移动到另一台服务器,当他返回到同一台服务器时,会话被验证。@Karooka您的意思是会话未被验证吗?因为如果它被验证,那么它将正常运行,而不是,正确吗?通过验证,我的意思是,检查会话是否包含会话变量。@Karooka我知道术语validating:),我想问的是你在前面的句子中的意思。在您的问题中,您说问题是验证,但现在您说的是“用户移动到另一台服务器,当他返回到同一台服务器时,会话被验证”。所以在你的问题中,你说了一件事,现在你说了相反的事,所以我问你这两种说法互相矛盾,是什么意思。但是当回到
https
时,它不应该重新启动会话吗?是的,它应该-如果不是这样的话,在上面还有其他事情发生。但首先,您应该检查
会话.cookie\u secure
设置。如果您在具有相同域名的非ssl vhost中使用具有相同名称的新cookie覆盖该设置,则不会进行此操作