了解codeigniter会话

时间:2011-11-09 19:53:24

标签: php codeigniter session

我正在尝试使用codeigniter构建一个基本的登录脚本,但有些东西我不明白...

如何在您登录后,仅在您登录后初始化会话?

您是否必须在成员区域的每个构造函数中放置$this->load->library('sessions')

我失去了:P

5 个答案:

答案 0 :(得分:7)

将会话类置于application/config/autoload.php

中的自动加载器配置中
$autoload['libraries'] = array('session' /* , ... */);

然后它在每个控制器中自动可用:

$session_id = $this->session->userdata('session_id');

并且您可以在每次登录之后(并且仅在!之后)初始化会话数据。

它被称为session而不是sessions。因此,如果您不想自动加载(自动加载会话库没有多大意义,但无论如何,做你想做的事情),使用正确的库名称使其工作;)

答案 1 :(得分:2)

最好的方法是创建自己的扩展CI_Controller的Controller类。

基本上当你说:

class Controller_name extends CI_Controller {}

您可以将其更改为

class Controller_name extends My_Controller {}

My_Controller将进行身份验证,如果页面不需要用户登录,则使用标准CI_Controller类。

更新:

我在工作中写了这篇文章,没有代码示例来更好地展示这一点。

MY_Controller.php中创建/applications/core/并使用以下代码。

<?php

class  MY_Controller  extends  CI_Controller  {

    function __construct() {
        parent::__construct();

        // Verify logged in status.
        if ( ! $this->session->userdata('loggedIn') ) redirect('/login');
    }
}

然后在login控制器中设置一个名为loggedIn的会话变量。我通常会将此值设为用户ID,以便我快速参考。

现在,如果您想让任何控制器要求用户登录,请扩展您的新MY_Controller类。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Dashboard extends MY_Controller {

    /* Your Code */

}

如果用户没有loggedIn作为会话变量,那么他们将被重定向到login控制器。

希望这有帮助。

答案 2 :(得分:2)

自动加载Codeigniter会话时要小心,特别是如果您使用MySQL作为高负载网站的会话存储。除了显而易见的减速(最终)读/写活动外,Codeigniter总是会给机器人,特别是谷歌机器人。根据您自己在Google网站站长工具中的网站设置,这可能会导致性能下降。

我发现会话存储的最有效方式是Memcache。我尝试过MongoDB,但这有时会带来更多弊大于利。我使用位于here的Codeigniter的Memcache打开了我自己的会话管理。

Memcache有自己的内部垃圾收集器方式比Codeigniter更强大,因此您不必担心存储的大小。如果需要,您可以简单地增加Memcache内存大小。我建议~4GB用于高负荷网站,每秒并发请求超过100个。

祝你好运!

答案 3 :(得分:0)

您可以创建一个新的控制器类,它将扩展“CI_controller”。您需要使用“MY_”前缀对其进行命名,并将其放入“/ system / application / libraries /”文件夹中。在自定义控制器的构造中,您可以启动会话。如果您的控制器需要auth,则扩展自定义类,否则扩展“CI_controller”类。

答案 4 :(得分:0)

我喜欢使用库来处理与会话数据的所有交互。将库添加到自动加载配置中,您可以根据需要从代码中的任何位置引用它。

我建议您查看现有的身份验证库(例如Ion_Auth - 我最喜欢的起点),然后从那里构建或决定可以将哪些经验教训应用于您自己的需求。