为什么laravel序列化会话数据而不是会话编码/解码

时间:2017-01-27 15:08:53

标签: php laravel session laravel-5.3

通常,每当您开始/关闭会话时,会话都会使用session_encodesession_decode进行解码。

我知道会话编码/解码与序列化有点不同,并且会产生与我所看到的不同的结果。

我想知道为什么Laravel选择使用serializeunserialize来获取会话数据而不是:

session_encode()
session_decode($data)

不使用本机会话编码/解码器有什么好处?

这方面的一个例子可以在这里找到:

https://github.com/illuminate/session/blob/master/Store.php#L128

1 个答案:

答案 0 :(得分:2)

session_encode()序列化$_SESSION全球。所以serialize($_SESSION)几乎是一样的。

来自文档: 默认情况下,使用的序列化方法是PHP的内部方法,与serialize()不同。

http://php.net/manual/en/function.session-encode.php

使用serialize($value),您可以自己确定要序列化的内容,因为laravel使用它自己的会话实现,所以他们被迫使用serialize方法。请注意,他们可以使用json_encode方法,该方法速度更快但有其他一些缺点,serialize考虑数据类型,数据可以反序列化为对象而json_*不能

Laravel不使用session_start方法,$_SESSION全局不可用。

由于PHP实现中存在一些缺点,基本上会话的PHP实现被laravel遗漏了。自定义/ laravel实现更灵活。

来自laravel源

的注释
    // If a session driver has been configured, we will need to start the session here
    // so that the data is ready for an application. Note that the Laravel sessions
    // do not make use of PHP "native" sessions in any way since they are crappy.

https://github.com/laravel/framework/blob/7212b1e9620c36bf806e444f6931cf5f379c68ff/src/Illuminate/Session/Middleware/StartSession.php#L53

为什么php本地会话很糟糕?

我认为(意见)本机PHP会话的主要问题是你不能抛出异常等。这使得调试或维护好的堆栈跟踪变得更加困难。通过实现自己的会话管理器,您可以更好地控制会话存储/关闭的时间和位置,以维护您自己的应用程序流。

  

警告自PHP 5.0.5起,write和close处理程序在object之后调用   破坏因此不能使用对象或抛出异常。   由于不会被捕获也不会被捕获,因此无法捕获例外情况   显示任何异常跟踪,执行将停止   不料。但是,对象析构函数可以使用会话。

这一点也可能是一个问题

  

警告将对象用作会话保存处理程序时,这很重要   用PHP注册关闭函数以避免意外   PHP内部在关机时销毁对象的方式的副作用   并且可以防止写入和关闭被调用。通常你   应该使用注册'session_write_close'   register_shutdown_function()函数。