Получить доступ к значениям сеанса codeigniter из внешних файлов
В моем проекте codeigniter я добавил KCK Finder.
ему нужны некоторые значения сеанса, которые контролируются codeigniter. Как я могу получить доступ к значениям сеанса CI из внешних файлов?
6 ответов
<?php
ob_start();
include('index.php');
ob_end_clean();
$CI =& get_instance();
$CI->load->library('session'); //if it's not autoloaded in your CI setup
echo $CI->session->userdata('name');
?>
Если вы ищете доступ к сеансам (и они основаны на файлах) из-за пределов codeigniter и вы не хотите загружать CI, вы можете сделать это:
define('ENVIRONMENT', 'development');
$ds = DIRECTORY_SEPARATOR;
define('BASEPATH', dirname(dirname(dirname(__FILE__))));
define('APPPATH', BASEPATH . $ds . 'application' . $ds);
define('LIBBATH', BASEPATH . "{$ds}system{$ds}libraries{$ds}Session{$ds}");
require_once LIBBATH . 'Session_driver.php';
require_once LIBBATH . "drivers{$ds}Session_files_driver.php";
require_once BASEPATH . "{$ds}system{$ds}core{$ds}Common.php";
$config = get_config();
if (empty($config['sess_save_path'])) {
$config['sess_save_path'] = rtrim(ini_get('session.save_path'), '/\\');
}
$config = array(
'cookie_lifetime' => $config['sess_expiration'],
'cookie_name' => $config['sess_cookie_name'],
'cookie_path' => $config['cookie_path'],
'cookie_domain' => $config['cookie_domain'],
'cookie_secure' => $config['cookie_secure'],
'expiration' => $config['sess_expiration'],
'match_ip' => $config['sess_match_ip'],
'save_path' => $config['sess_save_path'],
'_sid_regexp' => '[0-9a-v]{32}',
);
$class = new CI_Session_files_driver($config);
if (is_php('5.4')) {
session_set_save_handler($class, TRUE);
} else {
session_set_save_handler(
array($class, 'open'),
array($class, 'close'),
array($class, 'read'),
array($class, 'write'),
array($class, 'destroy'),
array($class, 'gc')
);
register_shutdown_function('session_write_close');
}
session_name($config['cookie_name']);
session_start();
var_dump($_SESSION);
В качестве дополнительной очистки ответа "@Ben Swinburne":
- Скопируйте файл CI index.php и переименуйте его (т.е. index_for_external_app.php).
Откройте новый файл PHP (index_for_external_app.php), а затем отредактируйте следующие переменные на внешний путь:
-$application_folder -$system_path [i.e. $system_path = '../../system';]
Вызвать созданный файл PHP из вашей внешней системы
//include the CI index file within ob_start to prevent display other html ob_start(); require('../../index_for_external_app.php');///You should edit this path ob_end_clean(); //print the session variable for testing echo '<pre>'; print_r($_SESSION); echo '</pre>';
Я использую внешнее приложение для входа в систему и хотел использовать данные из сеансов CI. Я нашел эту информацию http://codeigniter.com/forums/viewthread/86380/ о том, как это сделать без запуска чего-либо из инфраструктуры CI. Для меня это идеально, так как это предотвратит возникновение несовместимости.
В случае возникновения проблем с извлечением информации по ссылке:
- Если вы используете сессионные куки, то получите только сессионные куки.
- Если вы используете сеанс ci с базой данных, получите cookie сеанса и запросите совпадение в базе данных в таблице ci_session для проверки сеанса.
- Используйте данные и добавляйте данные по мере необходимости в cookie (и в базу данных, если используется сеанс базы данных).
На ум приходят два решения (которые не включают декодирование файлов cookie CI)
1) Скопируйте их в обычные сессии PHP, когда вы назначаете внутренний CI:
$_SESSION['name'] = $this->session->userdata('name');
Таким образом, у вас есть доступ к каждому php-файлу на вашем сервере; Я считаю, что это самое быстрое решение.
2) сохранить сеансы в базе данных и подключиться к ней для получения значений.
Привет как раз перед тем, как я получил этот код, погуглив.
//path to your database.php file
require_once("../frontend/config/database.php");
$cisess_cookie = $_COOKIE['ci_session'];
$cisess_cookie = stripslashes($cisess_cookie);
$cisess_cookie = unserialize($cisess_cookie);
$cisess_session_id = $cisess_cookie['session_id'];
$cisess_connect = mysql_connect($db['default']['hostname'], $db['default'] ['username'], $db['default']['password']);
if (!$cisess_connect) {
die("<div class=\"error\">" . mysql_error() . "</div>");
}
$cisess_query = "SELECT user_data FROM ci_sessions WHERE session_id = '$cisess_session_id'";
mysql_select_db($db['default']['database'], $cisess_connect);
$cisess_result = mysql_query($cisess_query, $cisess_connect);
if (!$cisess_result) {
die("Invalid Query");
}
$cisess_row = mysql_fetch_assoc($cisess_result);
$cisess_data = unserialize($cisess_row['user_data']);
// print all session values
print_r($cisess_data);
Бенс отвечает с помощью include('index.php'), и получение экземпляра CI неплохо, но в моей ситуации эти действия выполняются слишком медленно.
Поскольку у меня есть codeigniter, настроенный на использование файлов, я сделал это решение, которое немного быстрее:
function CIsession()
{
$pathToSessionFiles = 'path/to/files/set/in/codeigniter/config/';
$h = md5($_SERVER['REMOTE_ADDR']); // $config['sess_match_ip'] = TRUE;
foreach( glob($pathToSessionFiles . '*' ) as $f )
{
if( strpos($f, $h) ) { $s[ $f ] = filemtime($f); }
}
arsort($s);
$s = array_keys($s);
$s = reset($s);
$s = file($s);
$s = reset($s);
$s = explode(';', $s);
foreach($s as $k => $v)
{
$s[$k] = str_getcsv($v, ":", '"');
$s[$k][0] = substr(reset($s[$k]), 0, strpos(reset($s[$k]), '|'));
$s[reset($s[$k])] = end($s[$k]);
unset($s[$k]);
}
return $s;
}
Надеюсь, это поможет кому-то!