【问题标题】:PHP Session class similar to CodeIgniter Session Class?PHP Session 类类似于 CodeIgniter Session 类?
【发布时间】:2012-07-20 17:13:46
【问题描述】:

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

我尝试搜索,但没有得到有用的结果。 我正在使用 CodeIgniter 会话类,它有几个特性 非常喜欢:

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

我想在 CodeIgniter 之外使用这个类(不使用 CodeIgniter)。 谁能给我推荐一个具有这些功能的课程?

谢谢!

【问题讨论】:

  • CodeIgniter 类。严肃地说,它是开源的,只需复制他们的代码,不是吗? (更好的是,尝试了解它的工作原理并在此基础上构建自己的)
  • 是的,如果没有人这样做,我会这样做。
  • 您始终可以在 $_SERVER 中找到用户 ip、代理数据等。您确定要将这些数据保存在数据库中吗?此类与您的用户的 cookie 一样安全
  • CodeIgniter 类有一个垃圾收集器来清理旧条目。 link。它易于使用。

标签: php codeigniter session


【解决方案1】:

其实那是两双鞋:PHP Sessions 和 codeigniter session。很高兴了解主要差异,这基本上就是在 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 类关注会话生命周期:初始化、更新和销毁。 PHP 本身负责启动事实会话并保存它。当然,您也可以为会话存储添加一个类,但如果您关心性能和简单性,通常可以在 php.ini 中进行配置。

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

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

所以,找出你需要什么。像这样实现,它可能非常简单。明智地编写您自己的 Session 类,feel free to use that one above as a base 并添加您需要的功能。

【讨论】:

  • 不客气。这门课写得很快,所以添加你缺少的东西(并询问你是否有不清楚的地方)。了解 PHP ini 设置也是这里的一个关键点,codegniter 将会话配置放入他们的配置文件中,PHP 有它自己的配置文件 (php.ini)。
【解决方案2】:

在此链接中掠夺

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

例子

 $session = new Session();

 $session->__destruct();

【讨论】:

    猜你喜欢
    • 2023-02-14
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多