Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Codeigniter会话死亡_Php_Codeigniter_Session - Fatal编程技术网

Php Codeigniter会话死亡

Php Codeigniter会话死亡,php,codeigniter,session,Php,Codeigniter,Session,在我的系统中使用了一点(25分钟-1.5小时)之后,用户体验到了一种刺激。出于某种原因,我的疗程有点像染色。我认为客户端的cookie不知何故丢失了会话ID并创建了一个新的会话ID。我正在数据库中保存会话数据 这是我的会话配置: $config['sess_cookie_name'] = 'v2Session'; $config['sess_expiration'] = 32400; //session will be 9 hours, for

在我的系统中使用了一点(25分钟-1.5小时)之后,用户体验到了一种刺激。出于某种原因,我的疗程有点像染色。我认为客户端的cookie不知何故丢失了会话ID并创建了一个新的会话ID。我正在
数据库中保存会话数据

这是我的会话配置:

        $config['sess_cookie_name']     = 'v2Session';
        $config['sess_expiration']      = 32400; //session will be 9 hours, for a shift.
        $config['sess_expire_on_close'] = FALSE;
        $config['sess_encrypt_cookie']  = TRUE;
        $config['sess_use_database']    = TRUE;
        $config['sess_table_name']      = 'ci_sessions';
        $config['sess_match_ip']        = TRUE;
        $config['sess_match_useragent'] = TRUE;
        $config['sess_time_to_update']  = 300;
现在,当我查看数据库时,我看到每个用户都有多个会话。每次踢腿都意味着一个新的会话,而旧会话在到期之前不会被删除。当会话“分离”时,用户需要再次登录

如有任何帮助,我们将不胜感激

编辑:

因此,经过一些研究,我注意到会话死亡是因为保存在
cookie
中的
session\u id
和保存在
数据库中的
session\u id
不匹配。我怀疑当用户在不同的选项卡/窗口上加载每个页面2页时会发生这种情况。一次加载发生在会话更新
会话\u id
时,第二次加载(使用旧的
会话\u id
终止会话)时。系统在
数据库中查找会话,但未找到该会话结果:来自系统的提示+mad用户


有人经历过吗?有人知道如何解决这个问题吗

您可以使用基本的php代码

ini_set('session.gc_maxlifetime', 32400);
简短的回答

不要在多个实例上启动会话。只要检查现有实例,如果我们讨论的是授权,那么如果会话不存在,就将用户踢到AuthLogin页面。 创建一个Auth类/库并让它处理事情。如果会话不存在,它将要求创建另一个会话

这些不是“多个”会话,唯一的会话ID是统计上具有很强熵的随机字符串,使用MD5散列以便于移植,并且每五分钟重新生成一次(默认情况下)

--在下,会话如何工作?

当您执行session_destroy时,它会从数据库中销毁与用户相关的会话(多个或单个),并使cookie过期。是的,糟糕的设计,我知道

从您编辑的问题中

因此,经过一些研究后,我注意到这些课程的消亡是因为 保存在cookie中的会话\u id和 保存在数据库中的数据不匹配。我怀疑这种情况发生在 用户在不同的选项卡/窗口上分别加载2页。一次装载 在会话更新会话id和第二个 使用旧会话id加载(终止会话)。系统 在数据库中查找会话,但未找到它

在多个选项卡中打开页面=在单个选项卡上刷新

您是否在未检查会话是否存在的情况下设置会话?请分享你的剧本

我会一直关注这个答案,直到我们找到答案

是的,我也有类似的问题,结果是我过去设置会话时没有检查会话是否已经存在,每次我创建会话时,它们都会在浏览器中覆盖会话(cookie),并在数据库中创建另一行。听起来你也面临同样的问题

丑陋的黑客

将此设置为您的配置:

    $config['sess_cookie_name']     = 'v2Session';
    $config['sess_expiration']      = 32400; //session will be 9 hours, for a shift.
    $config['sess_expire_on_close'] = FALSE;
    $config['sess_encrypt_cookie']  = TRUE;
    $config['sess_use_database']    = TRUE;
    $config['sess_table_name']      = 'ci_sessions';
    $config['sess_match_ip']        = TRUE;
    $config['sess_match_useragent'] = TRUE;
    $config['sess_time_to_update']  = 32400; // Session will update in 9 hours.

这是独一无二的问题。。。然而,在分析会话与数据库不匹配时,它清楚地表明,在sess_time_to_更新时,数据库可能不会更新相关id。。。但是,除非您尝试,否则此解决方案仍然是一种假设。

为什么不尝试以下方法:

  • 检查用户是否有活动会话如果会话处于活动状态=无需执行任何操作一切正常
  • 现在,如果用户没有活动会话,您需要做两件事

  • 获取用户cookies,如果存在cookies,您将再次启动会话,用户将很好,并根据其拥有的cookies直接登录
  • B.如果会话未激活且没有cookies,则需要将他带到登录页面

    这里有一个例子

    <?php
    $expire=time()+60*60*24*30;
    setcookie("user", "Login_USERNAME", $expire);
    ?>
    
    
    
    在上述示例中,过期时间设置为一个月(60秒*60分钟*24小时*30天)

    好了,现在你应该去拿饼干了

        <?php
    ///Check if session alive or not
    if (!empty($_SESSION['user'])){
         //Do Nothing the user is logged in 
    
        }
    ///There is Cookies BUT No Session
    elseif (isset($_COOKIE["user"]) && empty($_SESSION['user'])){
          // Here you can see that there is cookies on the user PC and at the same time the Session is Not active so you should make session start and make user auto login again
        }
    
    ///There is no Cookies and Session is not alive
        elseif (!isset($_COOKIE["user"]) && empty($_SESSION['user'])){
          // Here you can see that there is No cookies and at the same time the Session is Not active so you should take user to login page
        }
    ?>
    
    
    
    这就是它,你需要用你自己的代码来安排它,但这是完成它的方法


    注意:确保用户注销时清除cookies,这样它就不会再次自动登录。

    我也是codeigniter开发人员。我在申请中还申请了以下代码:-

    $config['sess_cookie_name']     = 'ci_session';
    $config['sess_expiration']      = 300; // 7200
    $config['sess_expire_on_close'] = FALSE;
    $config['sess_encrypt_cookie']  = true;
    $config['sess_use_database']    = true;
    $config['sess_table_name']      = TBL_SESSION;
    $config['sess_match_ip']        = FALSE;
    $config['sess_match_useragent'] = TRUE;
    $config['sess_time_to_update']  = 300;
    
    1) opening application in firefox mozilla at 10:55 pm then it will take You in login screen at 11:00 pm.
    
    2) at the same time , opening application in chrome browser at 10:56 pm  then it will take You in login screen at 11:05 pm.
    
    在我的应用程序中,每5分钟后,会话就会过期。我正在使用table tbl_会话保存记录。考虑到以下2个条件,它非常适合我的应用程序:-

    $config['sess_cookie_name']     = 'ci_session';
    $config['sess_expiration']      = 300; // 7200
    $config['sess_expire_on_close'] = FALSE;
    $config['sess_encrypt_cookie']  = true;
    $config['sess_use_database']    = true;
    $config['sess_table_name']      = TBL_SESSION;
    $config['sess_match_ip']        = FALSE;
    $config['sess_match_useragent'] = TRUE;
    $config['sess_time_to_update']  = 300;
    
    1) opening application in firefox mozilla at 10:55 pm then it will take You in login screen at 11:00 pm.
    
    2) at the same time , opening application in chrome browser at 10:56 pm  then it will take You in login screen at 11:05 pm.
    

    需要记住的一件事-上面的代码将在您的config.php中,并且在应用程序的每个控制器中,都会有一个会话活动性检查。

    我也遇到了同样的问题,这个配置状态最终起到了帮助作用:

    $config['sess_cookie_name'] = 'ci_session';
    $config['sess_expiration'] = 604800; // 604800 = 1 week
    $config['sess_expire_on_close'] = FALSE;
    $config['sess_encrypt_cookie'] = FALSE;
    $config['sess_use_database'] = TRUE;
    $config['sess_table_name'] = 'ci_sessions';
    $config['sess_match_ip'] = TRUE;
    $config['sess_match_useragent'] = TRUE;
    $config['sess_time_to_update'] = 604800; // 604800 = 1 week
    
    sess_时间_to_更新必须与sess_过期相同

    sess\u encrypt\u cookie必须为FALSE,从会话如何工作?

    加载页面时,会话类将检查是否有效 会话数据存在于用户的会话cookie中。如果会话数据 不存在(或者如果已过期),将创建新会话 保存在饼干里。如果会话确实存在,则其信息将 将被更新,cookie将被更新。在每次更新中 将重新生成会话id

    您是否尝试过使用CodeIgniter日志功能来查看会话模块是否有意创建新会话?更具体地说,您可能希望对CI_Session类(system/libraries/Session.php)进行一些调试

    sess\u read
    中有两个点,CI将确定没有当前会话。如果启用日志记录,则可以看到CI是否满足这些条件

    CI_会话::sess_读取(条件1) CI_会话::ses
    $config['sess_cookie_name']     = 'ci_session1';
    
    $config['sess_cookie_name']     = 'ci_session2';
    
    $config['sess_cookie_name']     = 'ci_session3';