Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel会话数据在页面加载时不粘滞_Php_Session_Laravel_Laravel 4 - Fatal编程技术网

Php Laravel会话数据在页面加载时不粘滞

Php Laravel会话数据在页面加载时不粘滞,php,session,laravel,laravel-4,Php,Session,Laravel,Laravel 4,我尝试运行以下代码: Session::put('progress', '5%'); dd(Session::get('progress')); 这将在转储中显示“5%” 如果我重新运行同一页面,但注释掉Session::put('progress','5%”)因此,只有dd()行被调用,我得到一个空值,而不是上一个页面加载中存储的5%的值 这是我的会话配置,因此我知道它应该存储数据: 'driver' => 'native', 'lifetime' => 120, 'expir

我尝试运行以下代码:

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

dd(Session::get('progress'));
这将在转储中显示“5%”

如果我重新运行同一页面,但注释掉
Session::put('progress','5%”)
因此,只有
dd()
行被调用,我得到一个空值,而不是上一个页面加载中存储的5%的值

这是我的会话配置,因此我知道它应该存储数据:

'driver' => 'native',
'lifetime' => 120,
'expire_on_close' => false,

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

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

当Laravel应用程序生命周期开始时,在应用程序生命周期结束之前,
会话
中的任何值都不会被存储。也就是说,在
会话
中放入的任何值都将最终/真正地
存储

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

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

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

     $this->replace($all);
 }

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

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

    Route::get('test', function() {
        Session::put('progress', '5%');
        // dd(Session::get('progress'));
    });
    
  • 检索已存储的值:

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

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

    对我来说,即使数据已正确存储到会话中:

        dd(Session::all());
    
    不返回任何内容,但:

        print_r(Session::all());
    

    返回所有会话数据

    在我的例子中,我在一个请求中闪现了变量,然后在另一个请求中将其放入会话(使用相同的名称)


    不幸的是,终止方法遍历了所有以前刷新的属性并清理了我新创建的会话属性(它在以前的请求中被刷新了,所以laravel认为它不再是必需的,并且无法判断它是新创建的)。我找到了调试
    内核->终止emidware
    方法。您可以在终止方法中放置断点。在某个阶段,它会到达
    Store->ageFlashData
    。这是负责删除我的属性的方法。

    我移动了会话中间件

    \Illumb\Session\Middleware\StartSession::class

    指向中的属性$middleware

    app/Http/Kernel.php

    在这种情况下,您需要将其从web组($middlewareGroups)中删除


    它帮助了我,我希望它也能帮助你

    我相信这是因为你在用
    dd()
    杀死脚本,在Laravel完成其生命周期之前,值没有存储到会话中。尝试在不使用
    dd
    的情况下输入一个值,以完成整个Laravel生命周期。然后,在那之后,试着找回它。非常好!感谢您不仅提供了解决方案,而且对管道系统进行了详细的解释。:)我可以强制Laravel立即写入会话数据吗?我试图用它来存储通过AJAX访问的进程的进度。laravel会话在哪里存储这些值?我在会话存储中看不到它们。在新安装中,会话存储驱动程序是磁盘文件。非常好的家伙。你用理智救了我的命,汉克斯。你救了我一天。即使你马上叫“die()”,这对你有用吗?出于某种原因,即使调用Session::save(),结果也是一样的。出于某种原因,我必须返回回复才能使其正常工作。我在使用L5.2和L5.3时刚刚注意到,当会话驱动程序设置为“Cookie”时,这种情况不起作用,因为Cookie不会立即保存,并且会在请求结束时排队成批发送。这意味着,如果你dd(),它将不起作用!Sux0rs。。。
        print_r(Session::all());