Laravel会话数据不会跨越页面加载

eCo*_*Evo 16 php session laravel laravel-4

我尝试运行以下代码:

Session::put('progress', '5%');

dd(Session::get('progress'));
Run Code Online (Sandbox Code Playgroud)

这将在转储中显示"5%".

如果我重新运行同一页面但注释掉Session::put('progress', '5%');以便只dd()调用该行,则会得到一个空值而不是前一页面加载中存储的5%值.

这是我的会话配置,所以我知道应该存储数据:

'driver' => 'native',
'lifetime' => 120,
'expire_on_close' => false,
Run Code Online (Sandbox Code Playgroud)

为什么Laravel不在页面加载中存储会话数据?

Rub*_*zzo 45

问题是因为你在Laravel完成其应用程序生命周期之前杀死了脚本,所以放入会话(但尚未存储)的值也被杀死了.

当Laravel应用程序生命周期开始时,任何价值putSession尚未存储到应用程序生命周期结束.也就是说,当任意值putSession将最后/真的stored.

如果您检查源,您将发现相同的上述行为:

 public function put($key, $value)
 {
     $all = $this->all();

     array_set($all, $key, $value);

     $this->replace($all);
 }
Run Code Online (Sandbox Code Playgroud)

如果要测试它,请执行以下操作:

  1. 在会话中存储值而不会终止脚本.

    Route::get('test', function() {
        Session::put('progress', '5%');
        // dd(Session::get('progress'));
    });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 检索已存储的值:

    Route::get('test', function() {
        // Session::put('progress', '5%');
        dd(Session::get('progress'));
    });
    
    Run Code Online (Sandbox Code Playgroud)

  • 非常好!感谢您不仅提供解决方案,还感谢您对管道的详细解释。:) (2认同)
  • 我可以强迫Laravel立即写入会话数据吗?我正在尝试使用它来存储通过AJAX访问的进程的进度。 (2认同)

小智 27

鲁本斯·马鲁佐的回答非常好.我只想补充一点,如果您需要立即存储数据,可以使用save方法:

Session::put('progress', '5%');
Session::save();
Run Code Online (Sandbox Code Playgroud)