PHP Session类与CodeIgniter Session Class类似?

时间:2012-07-21 21:46:21

标签: php codeigniter session

PHP会话类类似于CodeIgniter会话类?存在?

我试图搜索,但我没有得到有用的结果。 我使用的是CodeIgniter会话类,它有几个功能 喜欢这么多:

存储用户唯一的会话ID,用户的IP地址, 用户的用户代理数据,上次活动和其他信息 手动提供。这些信息存储在数据库(MySql)中。 该类创建一个cookie以将唯一会话ID与会话相匹配 id在数据库中。 在我看来,这门课非常安全。

我想在CodeIgniter之外使用这个类(不使用CodeIgniter)。 任何人都可以推荐我一个有这些功能的课程吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

实际上这是两双鞋子:PHP Sessions和codeigniter会话。很高兴了解主要差异,这基本上就像在代码签名中一样,会话确实重新发明了大部件的轮子,并添加了一些功能。

因此,在继续之前,可能值得研究Session chapter in the PHP manual ,PHP的内置会话支持非常强大 - 但是没有对象接口。

例如,将PHP会话存储到数据库中(默认为文件系统),这是由所谓的session save handler支持的。一些PHP扩展提供了一个保存处理程序(例如memcache)。为了减轻你的想法,这适用于与memchache协议兼容的任何内容,例如: MySQL。但那只是一个的例子。如果您正在寻找与本机PHP会话无关的会话类,请在搜索中添加“PHP 3”,因为在版本4之前,PHP没有本机会话,而且其他人需要会话,因此他们编写了自己的库。

好的,为了理智,今天使用PHP,寻找会话并说不想接触PHP会话是:只是愚蠢。您可能不想触摸文件系统,然后存储到cookie。您可能不希望存储到cookie,存储到任何快速和服务器端的存储:memcached,mysql,couchdb,ssd文件系统。随你。 PHP原生会话在这里非常灵活:

您也可以编写自己的用户登陆会话保存处理程序并将会话存储到数据库中。实际上任何键值存储都会这样做:键是会话ID,值是编码(序列化)会话数据。那是一个二进制字符串。

正如轮码签名器的重新发明所做的那样,您可能正在寻找一些功能。基本上你总是可以看一下session component of codeiginiter的源代码,它并不复杂。有了一个好的IDE,你可以选择你想要检查的东西,或者只是将它视为灵感。

一个特征是元数据codeigniter分配给一个会话,例如远程地址,会话开始时间(非常有用)和最后一个活动(也是有用的)。您可以通过在每次启动时将其存储到会话中来轻松模仿您自己的模式(例如下面的示例)。为此,您可以创建自己的会话对象。以下只是一个简单的例子,但它已经有一些很好的功能:

  • 创建会话
  • 远程IP,创建和最后活动时间戳等元数据。
  • 如果适用,销毁Cookie。

用法:

$session = new Session();
$session['foo'] = 'bar';
$session->destroy(); // yes, full destroy

代码:

/**
 * Session class
 *
 * @license MIT
 * @license-year 2012
 * @license-copyright-holder hakre <http://hakre.wordpress.com>
 */
class Session implements ArrayAccess
{
    private $meta = '__meta';
    private $started;

    public function __construct()
    {
        if (ini_get('session.auto_start')) {
            $this->started = true;
            $this->start();
        }
    }

    public function start()
    {
        $this->started || session_start();
        (isset($_SESSION[$this->meta]) || $this->init())
            || $_SESSION[$this->meta]['activity'] = $_SERVER['REQUEST_TIME'];
        $this->started = true;

    }

    /**
     * write session data to store and close the session.
     */
    public function commit()
    {
        session_commit();
    }

    public function destroy()
    {
        $_SESSION = array();
        if (ini_get("session.use_cookies")) {
            $params = session_get_cookie_params();
            setcookie(session_name(), '', time() - 42000,
                $params["path"], $params["domain"],
                $params["secure"], $params["httponly"]
            );
        }
        session_destroy();
    }

    public function get($name, $default = NULL)
    {
        return isset($_SESSION[$name]) ? $_SESSION[$name] : $default;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return session_name();
    }

    private function init()
    {
        $_SESSION[$this->meta] = array(
            'ip'       => $_SERVER['REMOTE_ADDR'],
            'name'     => session_name(),
            'created'  => $_SERVER['REQUEST_TIME'],
            'activity' => $_SERVER['REQUEST_TIME'],

        );
        return true;
    }

    /**
     * Whether a offset exists
     * @link http://php.net/manual/en/arrayaccess.offsetexists.php
     * @param mixed $offset
     * @return boolean true on success or false on failure.
     * The return value will be casted to boolean if non-boolean was returned.
     */
    public function offsetExists($offset)
    {
        $this->started || $this->start();
        return isset($_SESSION[$offset]);
    }

    /**
     * Offset to retrieve
     * @link http://php.net/manual/en/arrayaccess.offsetget.php
     * @param mixed $offset
     * @return mixed Can return all value types.
     */
    public function offsetGet($offset)
    {
        $this->started || $this->start();
        return $this->get($offset);
    }

    /**
     * Offset to set
     * @link http://php.net/manual/en/arrayaccess.offsetset.php
     * @param mixed $offset
     * @param mixed $value
     * @return void
     */
    public function offsetSet($offset, $value)
    {
        $this->started || $this->start();
        $_SESSION[$offset] = $value;
    }

    /**
     * Offset to unset
     * @link http://php.net/manual/en/arrayaccess.offsetunset.php
     * @param mixed $offset
     * @return void
     */
    public function offsetUnset($offset)
    {
        unset($_SESSION[$offset]);
    }
}

总结一下:如果使用PHP会话,则使用PHP会话。它们功能强大,但您可能希望在顶部添加操作。上面的示例性Session类负责会话生命周期:Init,Update和destroy。 PHP iteself负责启动事实会话以及保存它。当然,您也可以为会话存储添加一个类,但如果您担心性能和简单性,通常可以在php.ini中配置它。

除此之外,还有更高级的东西:

  • 重新生成会话ID(PHP支持,很容易添加到类或只是调用PHP的功能)
  • 将数据从一个会话复制到另一个会话(PHP不容易支持这一点,如果你需要它,将这样的功能包装到会话类中是值得的 - codeigniter也没有这个功能)< / LI>
  • 如果当前运行会话(全局PHP会话),则获取状态。当{且仅当需要时,Session类是添加的好地方。您可以在相关问题中找到相应的代码:How to tell if a session is active?

所以,找出你需要的东西。实现这一点,它可以是非常微不足道的。明智地编写自己的Session类feel free to use that one above as a base并添加所需的功能。

答案 1 :(得分:0)

在此链接中掠夺

http://stevedecoded.com/blog/custom-php-session-class

实施例

 $session = new Session();

 $session->__destruct();