Php Laravel 5.3:会话数据库未按预期工作
我刚刚添加了默认的Laravel迁移,以使用数据库会话。在此之前,我使用的是文件系统。我这样做了:Php Laravel 5.3:会话数据库未按预期工作,php,database,laravel,session,laravel-5.3,Php,Database,Laravel,Session,Laravel 5.3,我刚刚添加了默认的Laravel迁移,以使用数据库会话。在此之前,我使用的是文件系统。我这样做了:php-artisan-session:table,然后添加了我已经在文件会话中使用的所有列。在此之后,我使用默认值'driver'=>env('session\u driver','database'),更改了config/session.php,然后我将.env更改为 BROADCAST_DRIVER=log CACHE_DRIVER=file SESSION_DRIVER=database Q
php-artisan-session:table
,然后添加了我已经在文件会话中使用的所有列。在此之后,我使用默认值'driver'=>env('session\u driver','database'),
更改了config/session.php
,然后我将.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
目标我想使用数据库,因为经过一些阅读,这是一种在用户身份验证()时更改数据的方法。我使用会话创建视图。例如:
@if( Session::get('intellitaux_simple') == 1 )
<li class="@if ($coreData['navChild'] == 'simple') active @endif">
<a href="{{ url('/intellitaux/simple') }}">INTELLITAUX SIMPLIFIÉ</a>
</li>
@endif
@if(Session::get('intellitaux\u simple')==1)
@恩迪夫
会话的数据是在用户使用logsuccessfullogin.php
事件登录时添加的
有时我需要给已经登录的用户提供访问新链接的权限,但我不想强迫他们注销然后再登录。如果处于活动状态,我希望直接在用户会话中应用更改。所以,如果您能帮助我找出我的数据库会话无法工作的原因,我将不胜感激
如果你认为有更好的方法来达到我的目标,建议,我将不胜感激 为什么要编写
,但只填充php artisan会话: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-migrate
在php-artisan-session:table
之后。是否迁移了6列表
此表填写在以下文件中
vendor/laravel/framework/src/illumb/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 user Session行中Session表的key列中。
Session::set('key',value)
changespayload
field only.1。这些文件是新的吗?它可能只是旧文件。垃圾收集器无法删除它们,因为它会清理数据库并且不知道它们。2.每个创建的会话都是一行。如果用户在其他浏览器中打开网站,他将获得新会话。查看last_activity
字段以查找上次活动的会话。但请记住,用户可以在一组处于活动状态的计算机上拥有许多浏览器。我认为这是一个好方法。Smth类似于foreach{base64_解码(有效载荷)->set->base64_编码->保存}
我发现:$payload=unserialize(base64_解码($session->payload))代码>然后我可以使用$payload['key']=$value代码>。在此之后,运行一个$session->payload=base64_encode(序列化($payload))$会话->保存()代码>工作完美!