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 重复会话问题的主要内容,如果未能解决你的问题,请参考以下文章