【问题标题】:Laravel 5.3 : Sessions database not working as expectedLaravel 5.3:会话数据库未按预期工作
【发布时间】:2017-06-17 05:19:29
【问题描述】:

我刚刚添加了 Laravel 的默认迁移以使用数据库会话。在此之前,我使用的是文件系统。我这样做了:php artisan session:table 然后我添加了我已经在文件会话中使用的所有列。在此之后,我将config/session.php 更改为默认值'driver' => env('SESSION_DRIVER', 'database'),,然后将.env 更改为

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=database
QUEUE_DRIVER=sync

所以一切对我来说都很好,我运行这个命令:artisan admin:clear。该命令执行此操作:

public function handle()
{
    Artisan::call('clear-compiled');
    Artisan::call('cache:clear');
    Artisan::call('config:clear');
    Artisan::call('view:clear');
    Artisan::call('route:clear');
}

然后我运行这个命令:composer dumpautoload 然后php artisan migrate

也许所有这些命令都不是必需的,但我总是喜欢在更改配置时进行清理。

真正的问题
现在我仍在获取会话文件,并且我也将会话放入数据库,但仅填充了 php artisan session:table 命令中的默认 6 列。其他栏目都留null

目标
我想使用数据库,因为经过一些阅读,这是在用户是 Auth() 时能够更改数据的方法。我使用会话进行查看。示例:

@if( Session::get('intellitaux_simple') == 1 )
    <li class="@if ($coreData['navChild'] == 'simple') active @endif">
         <a href="{{ url('/intellitaux/simple') }}">INTELLITAUX SIMPLIFIÉ</a>
    </li>
@endif

会话的数据在用户使用LogSuccesfulLogin.php 事件登录时添加。

有时我需要向已经登录的用户授予访问新链接的权限,但我不想强迫他们先注销然后登录。如果处于活动状态,我想直接在用户会话中应用更改。所以,如果你能帮我弄清楚为什么我的数据库会话不工作,我将不胜感激。

如果您认为有更好的方法可以实现我的目标,请提出建议,我将不胜感激!

【问题讨论】:

    标签: php database laravel session laravel-5.3


    【解决方案1】:

    你为什么写but only the default column from the php artisan session:table command are filledsession:table 使用 6 个字段创建迁移,而不仅仅是一个:

        Schema::create('sessions', function (Blueprint $table) {
            $table->string('id')->unique();
            $table->integer('user_id')->nullable();
            $table->string('ip_address', 45)->nullable();
            $table->text('user_agent')->nullable();
            $table->text('payload');
            $table->integer('last_activity');
        });
    

    你也没有在php artisan session:table 之后提到php artisan migrate。您是否迁移了 6 列的表?

    此表填写在以下文件中 vendor/laravel/framework/src/Illuminate/Session/DatabaseSessionHandler.php:

        $payload = ['payload' => base64_encode($data), 'last_activity' => time()];
    
        if (! $container = $this->container) {
            return $payload;
        }
        if ($container->bound(Guard::class)) {
            $payload['user_id'] = $container->make(Guard::class)->id();
        }
    
        if ($container->bound('request')) {
            $payload['ip_address'] = $container->make('request')->ip();
    
            $payload['user_agent'] = substr(
                (string) $container->make('request')->header('User-Agent'), 0, $
            );
        }
    

    【讨论】:

    • 谢谢,我刚刚对默认值和 php 迁移进行了一些编辑。我不知道 DatabaseSessionHandler。我坚持使用 Session::set('key', value) 会将值放在 auth 用户会话行中会话表的键列中。
    • Session::set('key', value) 仅更改 payload 字段。
    • 1.这个文件是新的吗?它可以只是旧文件。垃圾收集器无法删除它们,因为它清理数据库并且不知道它们。 2. 每个创建的会话都是一行。如果用户在另一个浏览器中打开网站,他会获得新的会话。查看last_activity 字段以查找最后一个活动会话。但请记住,用户可以在一组计算机上拥有许多浏览器都处于活动状态。
    • 我认为这是一个好方法。喜欢foreach{ base64_decode(payload) -&gt; set -&gt; base64_encode -&gt; save }
    • 我找到了:$payload = unserialize(base64_decode($session-&gt;payload)); 然后我可以使用 $payload['key'] = $value; 更改我想要的内容。在此运行 $session-&gt;payload = base64_encode(serialize($payload)); $session-&gt;save(); 之后完美运行!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2011-07-20
    相关资源
    最近更新 更多