/ yii2

yii2-session

相关文章:

额外的会话字段

You can now easily store extra data in session storage. Currently it's supported in yii\web\DbSession but could be possibly extended to more storages in future. In order to configure it, modify the session component in your application config:

return [
    // ...
    'components' => [
        'session' => [
            'class' => 'yii\web\DbSession',
            'readCallback => function ($session) {
                return [
                    'expireDate' => Yii::$app->formatter->asDate($fields['expire']),
                ];
            },
            'writeCallback' => function ($session) {
                return [
                    'user_id' => Yii::$app->user->id,
                    'ip' => $_SERVER['REMOTE_ADDR'],
                    'is_trusted' => $session->get('is_trusted', false),
                ];
            }
        ],
    ],
];

Flash Data(只显示一次的提示消息)

Yii::$app->session->setFlash('sucess', '账单状态已更新');
Yii::$app->session->setFlash('error', '账单更新失败');

View 中:

<?php
foreach (Yii::$app->session->getAllFlashes() as $key => $message) {
    echo '<div class="alert alert-' . $key . '">' . $message . '</div>';
} ?>

Debug 小记

场景:

  1. 控制器初始化 session,渲染登录页面,记录 session.id.inittime.init
  2. 登录页面渲染完成后,Ajax 请求服务端,写 session 值,记录 session.id.settime.set
  3. 点击登录按钮,Ajax 请求服务器,读 session 值,记录 session.id.gettime.get

第一步:请求登录页面,记录 $_SESSION
第二步:页面加载完成后,Ajax 请求服务端,写 session 值,记录 $_SESSION
第三步:点击登录按钮,Ajax 请求服务端,读上一步写的 session 值,记录 $_SESSION

问题:第二步 Ajax 请求服务端,写 session 值,并没有写成功?尽管 $_SESSION 输出的值是符合预期的。

情况确认:

  • 同一个 session id;
  • 记录 $_SESSION 的时间是顺序执行的;

分析,应该是有移除 session 中 nickname 的代码被执行了。全局搜索 nickname 相关的 session 操作代码。

但是实际上并不是,而是因为第二个请求是通过 ajax 发送的,服务端并没有获取到发送的 session id。

经过一天排查,反复对比代码和环境,发现开启了 xdebug,造成 session 异常,关闭 xdebug 后一切正常。