您可以将会话存储在数据库中,框架将为您处理过期问题。
这个例子来自高级模板,我已经从前端用户那里获取了会话。
我需要创建和使用一个自定义组件来存储用户ID。
1)在数据库中创建一个表:
CREATE TABLE `session_frontend_user` (
`id` char(80) CHARACTER SET utf8 NOT NULL,
`user_id` int(11) DEFAULT NULL,
`ip` varchar(15) CHARACTER SET utf8 NOT NULL,
`expire` int(11) DEFAULT NULL,
`data` longblob,
PRIMARY KEY (`id`),
KEY `expire` (`expire`)
) ENGINE=InnoDB
2)从这个表格中创建一个模型:
<?php
namespace common\models;
use Yii;
class SessionFrontendUser extends \yii\db\ActiveRecord
{
public static function tableName()
{
return 'session_frontend_user';
}
public function rules()
{
return [
[['id', 'ip'], 'required'],
[['user_id', 'expire'], 'integer'],
[['data'], 'string'],
[['id'], 'string', 'max' => 80],
[['ip'], 'string', 'max' => 15]
];
}
public function attributeLabels()
{
return [
'id' => 'ID',
'user_id' => 'User ID',
'ip' => 'Ip',
'expire' => 'Expire',
'data' => 'Data',
];
}
}
3) 在config/main.php中更改配置
'components' => [
'session' => [
'class' => '\frontend\components\CustomDbSession',
'sessionTable' => 'session_frontend_user',
],
4) 在路径 \frontend\components 中创建所需的自定义组件 'CustomDbSession',该组件在配置中使用:
<?php
namespace frontend\components;
use Yii;
use yii\db\Connection;
use yii\db\Query;
use yii\base\InvalidConfigException;
use yii\di\Instance;
class CustomDbSession extends \yii\web\DbSession {
public $writeCallback = ['\frontend\components\CustomDbSession', 'writeCustomFields'];
public function writeCustomFields($session) {
try
{
$uid = (\Yii::$app->user->getIdentity(false) == null)?null:\Yii::$app->user->getIdentity(false)->id;
return [ 'user_id' => $uid, 'ip' => $_SERVER['REMOTE_ADDR'] ];
}
catch(Exception $excp)
{
\Yii::info(print_r($excp), 'informazioni');
}
}
}