PHP会话类类似的CodeIgniter会话类?(PHP Session class similar

2019-07-30 13:23发布

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

我试图寻找,但我没有得到有用的结果。 我是用笨会话类,有几个功能那么喜欢:

存储用户的唯一的会话ID,用户的IP地址,用户的用户代理的数据,最近活动,以及其它信息手动提供。 这些信息被存储在一个数据库(MySQL的)。 类中创建一个cookie,以独特的会话ID与数据库中的会话ID相匹配。 在我opnion,这个类是非常安全的。

我想用笨超出这个类(不使用笨)。 任何人都可以推荐我用这些功能的一类?

谢谢!

Answer 1:

其实这是两个双鞋:PHP会话和笨会议。 这是好事,知道的重大分歧,基本上都在笨会议并重新发明适用于大型工件车轮加上增加的一些功能。

所以,你继续它可能是值得看一看到之前在PHP手册会话章 ,PHP在会议上支持版本是非常强大-但不是一个对象接口。

例如PHP的会话存储到数据库中(默认是文件系统),即通过所谓的支持会话保存处理 。 有些PHP扩展提供了一个保存处理程序(如内存缓存)。 只是为了减轻你的头脑,这一点也适用任何与memchache协议兼容,如MySQL的 。 但是,这仅仅一个例子。 如果你正在寻找一个会话类,这是不相关的原生PHP会议上,加上“PHP 3”来搜索,因为4版本之前,PHP没有本地会话和肯定,需要会话别人,所以他们写自己的库。

好吧,是理智的,使用PHP的今天,寻找会议和说,一个不想碰PHP会议是:只是愚蠢。 你可能不想要触摸的文件系统,然后存储的cookie。 你可能不希望存储存储的cookie,任何存储是快速和服务器端:Memcached的,MySQL和CouchDB中,SSD文件系统。 随你。 PHP本地会话是非常灵活的位置:

您可以为编写自己的用户空间会话保存处理程序和会话存储到数据库中。 其实任何key-value存储会做:关键是会话ID和值是编码的(序列化)会话数据。 这是一个二进制字符串。

至于旁边的轮笨的重新发明写呢,还有你可能会寻找一些功能。 基本上,你总是可以看看到的源代码codeiginiter的会话组件 ,它并不复杂。 凭借良好的IDE,你可以选择你需要检查或只是查看它为灵感的东西。

一个特点是元数据笨分配给会话例如它是远程地址,会话起始时间(非常有用)和最后一项活动(有用,太)。 你可以很容易地模仿自己的这个存储到会话每次启动(下面的例子)时间。 对于您可以创建自己的会话对象。 以下只是一个光秃秃的例子,但已经有一些不错的功能:

  • 会议的创建
  • 元数据,如远程IP,创建和最后activitiy时间戳。
  • 如果适用饼干销毁。

用法:

$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 iteself需要开始实际会话,并约其保存的照顾。 当然,你可以添加一个类会话存储为好,但如果你担心性能和简单,通常这都是可以的php.ini中配置。

除此之外,还有更多先进的东西:

  • 再生会话ID(PHP支持,这样容易添加到类或只是调用PHP函数)
  • 从一个会话的数据复制到另一个(PHP不容易支持这一点,这是值得包裹这样的功能到会话类,如果你需要它-笨不具有,太)
  • 获得状态如果会话目前运行与否(全球PHP会话)。 该Session类是个好地方补充说, 当且仅当你需要它。 你会发现在一个相关的问题的代码: 如何判断一个会话处于活动状态?

因此,找出你所需要的。 实施为,它可以变得非常简单。 明智地写自己的会话课, 随意使用一个以上作为基础 ,并添加你需要的功能。



Answer 2:

掠夺这个链接

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

 $session = new Session();

 $session->__destruct();


文章来源: PHP Session class similar to CodeIgniter Session Class?