Codeigniter 重复会话问题

Posted

技术标签:

【中文标题】Codeigniter 重复会话问题【英文标题】:Codeigniter duplicate session issue 【发布时间】:2011-10-08 19:25:54 【问题描述】:

我有一个使用 session 类使用 codeigniter 构建的应用程序,并将会话数据存储在数据库中。问题是当我的网页加载 css 文件时,我的数据库中出现了额外的会话记录。

直到最近,我还在 rackspace 提供的简单 VPS 主机上运行我的应用程序。数据库和 Apache 都在同一个 VPS 上运行。不过最近我已将我的应用程序迁移到phpFog 以使其更容易扩展。我没有这个问题 我以前的托管设置。

user_data 填充值的行是我的原始会话。其他三个空白会话是简单地刷新页面 3 次的结果。我似乎已经追踪到在我的标题中包含一个 css 文件,当我将其注释掉或删除它时,问题就消失了。也只是这个特定的 css 文件,其他 css/js/image 文件不会导致此问题。

以下是相关 css 文件的链接: http://pastebin.com/XfEBNFiC

有人知道是什么原因造成的吗?谢谢!

更新: 我意识到相关页面的 html 可能会有所帮助。注释掉第 13 行包含的样式表会使问题消失。 http://pastebin.com/iBEb4he6

更新 2:

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$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']        = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update']  = 300;

/*
|--------------------------------------------------------------------------
| Cookie Related Variables
|--------------------------------------------------------------------------
|
| 'cookie_prefix' = Set a prefix if you need to avoid collisions
| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
| 'cookie_path'   =  Typically will be a forward slash
| 'cookie_secure' =  Cookies will only be set if a secure HTTPS connection exists.
|
*/

$config['cookie_domain']    = 'casey.phpfogapp.com'; //$base_url_parts['host'];
$config['cookie_path']      = '/';

$config['cookie_prefix']    = "";
$config['cookie_secure']    = FALSE;

【问题讨论】:

在我的会话表中为每个页面请求创建记录?该表将迅速增长,并且充满了实际上与用户会话无关的无用会话记录。哦,我可能应该说明实际用户会话似乎没有丢失。会话属性/变量从请求到请求进行维护。只是这些新记录突然出现。 我更新了问题以包含指向包含样式表的 html 的链接 我看到 CI 重复会话的问题(最终由于空白会话导致注销,所以这是一个问题)都与 AJAX 调用有关。 css 文件总是在 head 部分?它是否托管在同一台服务器上? 来自 CI 用户指南 -> " 注意:Session 类具有内置的垃圾收集功能,可以清除过期的会话,因此您无需编写自己的例程来去做吧。” 嗯,很奇怪。让我们从逻辑上看一下:设置了一个 CI cookie,因此包含了一个 CI 文件(例如您的配置文件)。设置它,以便当 $_SERVER['REQUEST_URI'] 匹配 css 文件时,您将 debug_print_backtrace(); 写入文件。检查该文件,您可能会知道更多。 auto_append/prepend 是 ini-files/vhost config/.htaccess 文件中的设置,您可以使用 ini_get() 进行检查。 【参考方案1】:

在我的应用程序中,我将以下代码放入 .htaccess 以防止 cookie 与 css/js/images 请求一起发送:

#.htaccess

# Use Mod_deflate to compress static files
<ifmodule mod_deflate.c>
<filesmatch ".(js|css|ico|txt|htm|html|php)$">
SetOutputFilter DEFLATE
</filesmatch>
</ifmodule>

# Speed up caching
FileETag MTime Size

# Expires
ExpiresActive On
ExpiresDefault "access plus 366 days"

# Future Expires Headers
<filesmatch ".(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Expires "Sat, 27 Dec 2014 23:59:59 GMT"
</filesmatch>

【讨论】:

【参考方案2】:

我之前遇到过这个问题,问题是 CI cookie 名称中不能有点。

错误的 cookie 名称:.domain.com

顺利犯罪:mydomaincom

我使用带点的域名作为 cookie 名称来启用域范围的 cookie(将 cookie 从主域共享到其所有子域),结果我发现我唯一需要的是:

$config['cookie_domain']    = ".domain.com";

【讨论】:

以上是关于Codeigniter 重复会话问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql慢查询中的Codeigniter会话查询

Facebook SDK + CodeIgniter 会话

Codeigniter 3 - 会话库

Codeigniter 3 - 从外部 Codeigniter 安装访问会话

手动设置会话过期时间-CodeIgniter

CodeIgniter 会话为空