【发布时间】:2011-11-09 19:53:24
【问题描述】:
我正在尝试使用 codeigniter 构建一个基本的登录脚本,但有些东西我不明白...
您如何在并且仅在您登录之后初始化会话?
会员区的每一个构造函数中都要$this->load->library('sessions')吗?
我迷路了:P
【问题讨论】:
标签: php codeigniter session
我正在尝试使用 codeigniter 构建一个基本的登录脚本,但有些东西我不明白...
您如何在并且仅在您登录之后初始化会话?
会员区的每一个构造函数中都要$this->load->library('sessions')吗?
我迷路了:P
【问题讨论】:
标签: php codeigniter session
将会话类放入自动加载器配置中,在application/config/autoload.php:
$autoload['libraries'] = array('session' /* , ... */);
然后在每个控制器中自动可用:
$session_id = $this->session->userdata('session_id');
并且您可以在每次登录之后(并且仅在之后!)初始化会话数据。
它被称为session 而不是sessions。所以如果你不想自动加载(not 自动加载会话库没有多大意义,但无论如何,做你想做的事),使用正确的库名让它工作;)
【讨论】:
最好的方法是创建您自己的扩展 CI_Controller 的 Controller 类。
基本上当你说:
class Controller_name extends CI_Controller {}
你可以把它改成
class Controller_name extends My_Controller {}
My_Controller 将执行身份验证,如果页面不需要用户登录,则使用标准 CI_Controller 类。
更新:
这是我在工作中写的,没有代码示例来更好地展示这一点。
在/applications/core/ 中创建MY_Controller.php 并使用以下代码。
<?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 控制器。
希望这会有所帮助。
【讨论】:
自动加载 Codeigniter 会话时要小心,尤其是当您使用 MySQL 作为高负载网站的会话存储时。除了明显减慢(最终)读/写活动之外,Codeigniter 将始终为机器人提供会话,尤其是谷歌机器人。根据您自己在 Google 网站管理员工具中的网站设置,这可能会导致性能下降。
我发现会话存储最有效的方式是 Memcache。我尝试过 MongoDB,但这有时也弊大于利。我使用位于here 的 Codeigniter 的 Memcache 开源了我自己的会话管理。
Memcache 拥有自己的内部垃圾收集器,其功能比 Codeigniter 的更强大,因此您不必担心存储空间的大小。如果需要,您可以简单地增加 Memcache 内存大小。对于具有超过 100 个并发请求/秒的高负载网站,我建议使用 ~4GB。
祝你好运!
【讨论】:
您可以创建一个新的控制器类来扩展“CI_controller”。您需要使用“MY_”前缀命名它并将其放入“/system/application/libraries/”文件夹中。在您的自定义控制器的构造中,您开始会话。如果您的控制器需要身份验证,则扩展自定义类,否则扩展“CI_controller”类。
【讨论】:
我喜欢使用库来处理与会话数据的所有交互。将库添加到您的自动加载配置中,您可以根据需要从代码中的任何位置引用它。
我建议查看现有的身份验证库(例如 Ion_Auth - 我最喜欢的起点),然后从那里构建或决定可以将哪些经验教训应用于您自己的需求。
【讨论】: