$ _SESSION未在Yii 1.1中填充自定义会话实现

时间:2017-02-05 21:20:00

标签: php session yii

我最近被要求处理使用Yii 1.1Php 5.3编写的遗留代码库。我们有一个客户会话实现调用rest api。代码如下所示: -

CSessionService extends CHTTPSession {

    public function open()
    {
        Session::setJSessionId();
        parent::open();
    }

    public function getUseCustomStorage()
    {
        return true;
    }

    public function regenerateID($deleteOldSession=false)
    {
        Session::setRegeneratedSessionId(
            SessionServiceAdapter::getInstance()->generateSessionId(), $deleteOldSession
        );

    }

    public function readSession($id)
    {
        return SessionServiceAdapter::getInstance()->getSessionData($id);
    }

    public function writeSession($id,$data)
    {
        return SessionServiceAdapter::getInstance()->replaceSession($id, $this->toArray());

    }

    public function destroySession($id)
    {
        if($id!=='')
        {
            SessionServiceAdapter::getInstance()->deleteSession($id);
            @session_unset();
            @session_destroy();

        }
    }
}

帮助程序会话类如下所示: -

class Core_Session
{
    protected static $_cache = array();

    public static function generateId()
    {
        session_regenerate_id(false);
    }

    public static function add($key, $data)
    {
        self::$_cache[$key] = $data;
        if ($data instanceof Transfer_Interface) {
            $data = array(
            'class' => get_class($data),
            'data' => $data->toArray()
            );
        }
        Yii::app()->session->add($key, $data);
    }

    public static function get($key)
    {
        if (!isset(self::$_cache[$key])) {
            $data = Yii::app()->session->get($key);
            if (is_array($data) && array_key_exists('class', $data)) {
                $className = $data['class'];
                $data = new $className($data['data']);
            }
            self::$_cache[$key] = $data;
            return $data;

        } else {
            return self::$_cache[$key];
        }
    }

    public static function remove($key)
    {
        $value = Yii::app()->session->remove($key);
        if (isset(self::$_cache[$key])) {
            unset(self::$_cache[$key]);
        }
        return $value;
    }

    public static function isRegistered($key)
    {
        if (isset(self::$_cache[$key])) {
            return true;
        }
        $result = in_array($key, Yii::app()->session->getKeys());
        return $result;
    }

    public static function getId()
    {
        return Yii::app()->session->sessionID;
    }

    public static function generateSessionId($customerId = null)
    {

            return SessionServiceAdapter::getInstance()->generateSessionId();

    }

     public static function setJSessionId() {
        session_id(static::generateSessionId());
     }
}

autostart设置为true。我遇到一个问题,在Session打开之后,即使$_SESSION被调用,我也没有看到readSession被填充。在尝试访问session_start之前,还会调用$_SESSION

有人能告诉我可能出现的问题吗?为什么$_SESSION没有填充?

如果我修改我的readSession,如下所示: -

public function readSession($id)
    {
        $val = SessionServiceAdapter::getInstance()->getSessionData($id);
        $_SESSION = $val;
        return $val;
    }

然后我看到$_SESSION已填充。但是在浏览了Yii的文档之后,在我看来我不应该明确地设置$_SESSION。如果我在访问session_start之前致电$_SESSION,Yii应该自动执行。

0 个答案:

没有答案