首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么laravel序列化会话数据而不是会话编码/解码

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

Stack Overflow用户
提问于 2017-01-27 15:08:53
回答 1查看 1.7K关注 0票数 4

通常,每次开始/关闭会话时,会话都使用session_encodesession_decode解码。

我知道会话编码/解码的工作方式与序列化略有不同,并产生与我所看到的不同的结果。

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

代码语言:javascript
运行
复制
session_encode()
session_decode($data)

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

在这里可以找到这样做的一个例子:

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

EN

Stack Overflow用户

回答已采纳

发布于 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来源的注意事项

代码语言:javascript
运行
复制
    // 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会话的主要问题是不能抛出异常等等,这使得调试或维护良好的堆栈跟踪变得更加困难。通过实现自己的会话管理器,您可以更好地控制存储/关闭会话的时间和地点,以维护自己的应用程序流。

警告从PHP5.0.5开始,在对象销毁后调用写和关闭处理程序,因此不能使用对象或抛出异常。异常不能被捕获,因为将不会被捕获,也不会显示任何异常跟踪,并且执行将意外地停止。但是,对象析构函数可以使用会话。

另外,这一点可能是个问题。

当使用对象作为会话保存处理程序时,重要的是向PHP注册关闭函数,以避免PHP在关闭时内部破坏对象的方式产生意外的副作用,并可能阻止调用写和关闭。通常,您应该使用session_write_close()函数注册‘register_shutdown_function’。

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41897087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档