CodeIgniter 2.1.0 的会话库中是不是有任何已知的错误?为啥我会被踢出去? [关闭]
Posted
技术标签:
【中文标题】CodeIgniter 2.1.0 的会话库中是不是有任何已知的错误?为啥我会被踢出去? [关闭]【英文标题】:Is there any known bug in the session library of CodeIgniter 2.1.0? Why do I get kicked out? [closed]CodeIgniter 2.1.0 的会话库中是否有任何已知的错误?为什么我会被踢出去? [关闭] 【发布时间】:2013-05-20 06:19:08 【问题描述】:我正在开发一个使用 CodeIgniter 2.1.0 创建的网站。
我注意到有时当我重新加载页面几次或非常快地打开几个页面时,或者当我在代码中出现错误(这些错误与会话无关)时,我会被注销。
本网站使用名为 Ion_authand 的库进行识别:
public function logged_in()
$identity = $this->ci->config->item('identity', 'ion_auth');
return (bool) $this->ci->session->userdata($identity);
是否有错误或我应该知道的事情?
$config['sess_cookie_name'] = 'cisession';
$config['sess_expiration'] = 7200;
$config['sess_expire_on_close'] = TRUE;
$config['sess_encrypt_cookie'] = FALSE;
$config['sess_use_database'] = TRUE;
$config['sess_table_name'] = 'cisession';
$config['sess_match_ip'] = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update'] = 300;
在这个网站上,几乎每个页面都会更新会话。
【问题讨论】:
有一个已知问题会导致 html 标头的 Content-Length 变得臃肿。这是因为每次向set_userdata()
或unset_userdata()
发出请求时,CI 都会发送整个“Set-Cookie”标头。这通常不是问题,但是如果您的用户使用严格的代理(大公司或教育机构),则很可能会导致会话完全失败。 github.com/EllisLab/CodeIgniter/issues/1345
还有一个关于会话和 ajax 调用的已知错误。
@Cryode 可能是它....有什么解决办法吗?
一个临时的解决方法是避免更新会话,如果它是一个 ajax 请求,但有时有它自己的警告。 See this SO question/answers,它会给你一些“解决方案”,并且有很多讨论的 CI 的 GitHub 问题的链接。
【参考方案1】:
这是我发现的:
CodeIgniter 的会话库中存在一个错误,它会破坏快速请求的会话。
您可以在此处找到有关此错误的更多信息:
https://github.com/EllisLab/CodeIgniter/issues/154
这个错误在最新的稳定版本 2.1.3 中仍然存在。
我已通过将会话库替换为来自 GitHub 的 CI3-DEV 的会话库来解决此问题:
https://github.com/EllisLab/CodeIgniter/blob/b211adee89f5fd2192051e9c0826146bd150f469/system/libraries/Session.php
并在我的配置中放置一个较长的 sess_expiration 和 sess_time_to_update ... 我的是 86400 和 86500。
【讨论】:
我会试一试.. 这个错误应该由 EllisLabs 修复.. 触摸木头,他们开始回到它上面 这仍然是 2.1.4 中的一个问题,令人费解。最初,我立即从sess_update()
尝试了简单的return
ing,但是唉,这不起作用,即使是很长的sess_time_to_update
。感谢您的回答,希望对您有所帮助。
@PaulSkinner 有点晚了,但是在你的配置中放了很长的 sess_expiration 和 sess_time_to_update .... 我的是 86400 和 86500【参考方案2】:
CodeIgniter 将会话数据保存在 cookie 中。如果会话数据中包含任何取消设置 cookie 的特殊字符,则会话也会被销毁。
它还会产生更多的大小限制问题。 Cookie 可以根据浏览器保存有限大小的数据。如果您尝试在 CodeIgniter 会话中存储更多数据,并且由于 CodeIgniter 尝试将其保存在 cookie 中,它可能不会保存超过该限制。
此外,由于 cookie 是通过网络发送的,它会不必要地增加网络流量。不应将所有会话数据保存在 cookie 中。
最好使用本机会话库。它使用 PHP 的原生会话。
https://github.com/EllisLab/CodeIgniter/wiki/Native-session
或
https://github.com/EllisLab/CodeIgniter/wiki/PHPSession
你可以比较两者。
有关 CodeIgniter 如何存储会话数据,请参阅 CodeIgniter 会话文档。
https://www.codeigniter.com/user_guide/libraries/sessions.html
【讨论】:
您是说它将会话数据保存在实际的 cookie 中吗?在服务器上? ...我以为它会将它们保存在数据库中? 是的,默认情况下 CI 仅将会话数据存储在 Cookie 中。您也可以将其存储在数据库中。但它仍然会保存在 Cookie+数据库中。请参考ellislab.com/codeigniter/user-guide/libraries/sessions.html thanx ,我知道,但是正如您在设置中看到的那样,我有$config['sess_use_database'] = TRUE
所以这不是 cookie 的事情......我要测试 Native 会话,看看会发生什么
关于本机会话...我很困惑,它说system/application/libraries/native_session.php
..在我的系统目录中我没有application
目录...我应该创建它吗?还是引用codeigniter根目录下的application
目录?
即使 $config['sess_use_database'] = TRUE,CI 也会将其存储到 cookie 和数据库中。以上是关于CodeIgniter 2.1.0 的会话库中是不是有任何已知的错误?为啥我会被踢出去? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
没有 Cookie 的 PHP 会话 | Codeigniter [关闭]
重定向后 CodeIgniter flashdata 不起作用
在Codeigniter下,是不是可以看到mysql_error()?