codeigniter переопределяет данные сеанса из не-ci приложения - PullRequest
2 голосов
/ 05 апреля 2019

У меня есть два кода в одном домене.Устаревший код работает с новым codeigniter приложением.

Устаревший код записывает некоторые данные в $_SESSION, которые мне нужно использовать в приложении codeigniter.

Если я использую session_start() в codeigniter Я могу получить доступ ко всем $_SESSION данным.

Но, если я использую

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

, я вижу только

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

Есть ли способ использоватьбиблиотека сеансов codeigniter и доступ к данным сеансов из устаревшего кода?

1 Ответ

0 голосов
/ 05 апреля 2019

Прямой ответ

- редактировать начало

Я понял, что вам нужно сделать противоположное Legacy -> CI, мой первоначальный ответ был CI -> PHP. Поэтому вам нужно установить session_id для CI, и я думаю, что было бы лучше всего использовать 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 Если вы используете драйвер Session 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. Если вы откроете каталог сессий, вы увидите его.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...