我最近被要求处理使用Yii 1.1
和Php 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应该自动执行。