通常,每当您开始/关闭会话时,会话都会使用session_encode
和session_decode
进行解码。
我知道会话编码/解码与序列化有点不同,并且会产生与我所看到的不同的结果。
我想知道为什么Laravel选择使用serialize
和unserialize
来获取会话数据而不是:
session_encode()
session_decode($data)
不使用本机会话编码/解码器有什么好处?
这方面的一个例子可以在这里找到:
https://github.com/illuminate/session/blob/master/Store.php#L128
答案 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_*
不能{ p>
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.
为什么php本地会话很糟糕?
我认为(意见)本机PHP会话的主要问题是你不能抛出异常等。这使得调试或维护好的堆栈跟踪变得更加困难。通过实现自己的会话管理器,您可以更好地控制会话存储/关闭的时间和位置,以维护您自己的应用程序流。
警告自PHP 5.0.5起,write和close处理程序在object之后调用 破坏因此不能使用对象或抛出异常。 由于不会被捕获也不会被捕获,因此无法捕获例外情况 显示任何异常跟踪,执行将停止 不料。但是,对象析构函数可以使用会话。
这一点也可能是一个问题
警告将对象用作会话保存处理程序时,这很重要 用PHP注册关闭函数以避免意外 PHP内部在关机时销毁对象的方式的副作用 并且可以防止写入和关闭被调用。通常你 应该使用注册'session_write_close' register_shutdown_function()函数。