【问题标题】:codeigniter overrides session data from a non-ci appcodeigniter 覆盖来自非 ci 应用程序的会话数据
【发布时间】:2019-08-27 01:04:01
【问题描述】:

我在同一个域上有两个代码。旧代码适用于新的 codeigniter 应用。

遗留代码将一些数据写入$_SESSION,我需要在codeigniter 应用程序中使用这些数据。

如果我在codeigniter 中使用session_start(),我可以访问所有$_SESSION 数据。

但是如果我使用

$this->load->library('session');
var_dump($_SESSION);
var_dump($this->session->all_userdata());

我看到的只是

array(1) { ["__ci_last_regenerate"]=> int(1554448209) } 

有没有办法使用 codeigniter 会话库并从遗留代码访问会话数据?

【问题讨论】:

    标签: php codeigniter session codeigniter-3


    【解决方案1】:

    直接回答

    --编辑开始

    我意识到你需要做相反的 Legacy --> CI,我原来的答案是 CI --> PHP。所以你必须在 CI 上设置 session_id,我认为最好使用 Hook pre_controller 和类似的东西:

    if(session_id() != $_GET['legacy-session-id']) {
        session_destroy();
        session_id($_GET['legacy-session-id']);
        session_start();
    }
    

    --编辑结束

    CI 会话配置

    $config['sess_driver'] = 'files';
    $config['sess_cookie_name'] = 'sess_';
    $config['sess_expiration'] = 3600;
    $config['sess_save_path'] = sys_get_temp_dir();
    $config['sess_match_ip'] = TRUE;
    $config['sess_time_to_update'] = 600;
    $config['sess_regenerate_destroy'] = FALSE;
    

    sess_cookie_name 必须是 sess_sess_match_ip 必须是 FALSE 如果您在旧版 PHP 中使用默认的 PHP 会话驱动程序,您可能会这样做。

    纯 PHP

    if(session_id()) session_destroy();
    $CI_SESSION_ID = '2gmv4p3tfb8ds0btmi1m5um9nfei5lku'; // you'll have to get somehow
    session_id( $CI_SESSION_ID );
    //if sess_match_ip == true
    //session_id( md5($_SERVER['REMOTE_ADDR']) . $CI_SESSION_ID );
    session_save_path (sys_get_temp_dir());
    session_start();
    
    echo 'session_id = ' . session_id() . '<br />';
    echo 'session_name = ' . session_name() . '<br />';
    echo "session_save_path = " . session_save_path () . '<br />';
    $_SESSION['my-test'] = time();
    var_dump($_SESSION);
    
    /* RESULT
    session_module_name = files
    session_id = f528764d624db129b32c21fbca0cb8d62gmv4p3tfb8ds0btmi1m5um9nfei5lku
    session_name = PHPSESSID
    session_save_path = C:\WINDOWS\TEMP
    D:\Projetos\sis-main\teste.php:18:
    array (size=2)
      '__ci_last_regenerate' => int 1554476877
      'my-test' => int 1554477377
    */
    

    CI 上的结果:

    
    echo 'session_id = ' . session_id() . '<br />';
    echo 'session_name = ' . session_name() . '<br />';
    echo "session_save_path = " . session_save_path () . '<br />';
    var_dump($_SESSION);
    /*
    session_module_name = user
    session_id = 5a82l70ra63p9bsch3rbhac1m4ekqppo
    session_name = sess_
    session_save_path = C:\WINDOWS\TEMP
    D:\Projetos\sis-main\application\core\MY_Controller.class.php:22:
    array (size=2)
      '__ci_last_regenerate' => int 1554477602
      'my-test' => int 1554477377
    */
    

    说明

    CodeIgniter 使用自定义会话处理程序。通过一些工程,我能够做到。

    如果您查看 CodeIgniter 会话驱动器,您会看到:

    //@CI_Session_files_driver::open
    
    $this->_file_path = $this->_config['save_path'].DIRECTORY_SEPARATOR
        .$name // we'll use the session cookie name as a prefix to avoid collisions
        .($this->_config['match_ip'] ? md5($_SERVER['REMOTE_ADDR']) : '');
    

    $name 变量(如果从 $config['sess_cookie_name'] 加载)。如果您已配置设置 IP 地址,则文件名上将包含 MD5。默认 PHP 会话驱动程序中没有。

    所以,如果你有这个 CI 配置

    $config['sess_driver'] = 'files';
    $config['sess_cookie_name'] = 'myproject_';
    $config['sess_expiration'] = 3600;
    $config['sess_save_path'] = sys_get_temp_dir();
    $config['sess_match_ip'] = TRUE;
    $config['sess_time_to_update'] = 600;
    $config['sess_regenerate_destroy'] = FALSE;
    

    您最终会得到会话 myproject_f528764d624db129b32c21fbca0cb8d62gmv4p3tfb8ds0btmi1m5um9nfei5lku 的此文件名。

    这是CI部分,现在让我们从PHP部分开始。

    默认的 PHP 会话驱动在文件名前面加上值“sess_”。所以你会有这样的东西:sess_ab0281624db129b32c21fbca0cb8d62。如果你打开你的会话目录,你会看到它。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 2011-06-25
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      相关资源
      最近更新 更多