通常,每次开始/关闭会话时,会话都使用session_encode
和session_decode
解码。
我知道会话编码/解码的工作方式与序列化略有不同,并产生与我所看到的不同的结果。
我想知道为什么Laravel选择使用serialize
和unserialize
来获取会话数据,而不是这样做:
session_encode()
session_decode($data)
不使用本机会话编码/解码器有什么好处?
在这里可以找到这样做的一个例子:
https://github.com/illuminate/session/blob/master/Store.php#L128
发布于 2017-01-27 15:50:53
session_encode()
序列化$_SESSION
全局。所以serialize($_SESSION)
几乎是一样的。
默认情况下,所使用的序列化方法是PHP的内部方法,与序列化()不一样。
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.
为什么php本机会话很糟糕?
我认为(意见)本机PHP会话的主要问题是不能抛出异常等等,这使得调试或维护良好的堆栈跟踪变得更加困难。通过实现自己的会话管理器,您可以更好地控制存储/关闭会话的时间和地点,以维护自己的应用程序流。
警告从PHP5.0.5开始,在对象销毁后调用写和关闭处理程序,因此不能使用对象或抛出异常。异常不能被捕获,因为将不会被捕获,也不会显示任何异常跟踪,并且执行将意外地停止。但是,对象析构函数可以使用会话。
另外,这一点可能是个问题。
当使用对象作为会话保存处理程序时,重要的是向PHP注册关闭函数,以避免PHP在关闭时内部破坏对象的方式产生意外的副作用,并可能阻止调用写和关闭。通常,您应该使用session_write_close()函数注册‘register_shutdown_function’。
https://stackoverflow.com/questions/41897087
复制相似问题