【发布时间】:2011-12-17 02:35:28
【问题描述】:
在我的 codeigniter 项目中,我添加了 KCK finder。
它需要一些由 codeigniter 控制的会话值。 如何从外部文件访问 CI 会话值?
【问题讨论】:
标签: php session codeigniter
在我的 codeigniter 项目中,我添加了 KCK finder。
它需要一些由 codeigniter 控制的会话值。 如何从外部文件访问 CI 会话值?
【问题讨论】:
标签: php session codeigniter
<?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');
?>
【讨论】:
include('index.php'); 文件,我已经从 external_codeigniter 文件夹中包含了它。你能帮忙吗?
application folder path 和 system folder path。
如果您希望从 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”回答的更多清理:
打开新的 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 的 cookie)
1) 当您分配内部 CI 时,将它们复制到常规 PHP 会话中:
$_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);
【讨论】:
我正在使用外部登录应用程序并希望使用来自 CI 会话的数据。我找到了这个信息http://codeigniter.com/forums/viewthread/86380/,关于如何在不从 CI 框架运行任何东西的情况下做到这一点。对我来说这是理想的,因为它可以防止任何不兼容性引起问题。
如果您在从链接中提取信息时遇到问题:
【讨论】:
Bens 使用 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;
}
希望它对某人有所帮助!
【讨论】: