Laravel 5.1 中 Session 数据存储、访问、删除及一次性Session实例教程 | 服务篇 | Laravel 5.1 基础教程


本站和网页 https://xueyuanjun.com/post/2045.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Laravel 5.1 中 Session 数据存储、访问、删除及一次性Session实例教程 | 服务篇 | Laravel 5.1 基础教程
Laravel 学院
文档
Laravel 8.x 中文文档
Laravel 7.x 中文文档
Laravel 6.x 中文文档
Laravel 5.8 中文文档
Laravel 5.7 中文文档
Laravel 5.6 中文文档
Laravel 5.5 中文文档
Laravel 5.4 中文文档
Laravel 5.3 中文文档
Laravel 5.2 中文文档
Laravel 5.1 中文文档
Lumen 中文文档
全栈教程
PHP 全栈工程师指南
PHP 入门到实战
Laravel 入门到精通
Vue.js 入门到实战
玩转 PhpStorm 教程
Laravel 博客入门项目
Laravel 微信小程序项目
Laravel 前后端分离项目
Swoole 入门到实战
Eloquent 性能优化实战
Redis 高性能实战系列
Laravel 新版本特性
PHP 新特性与最佳实践
Golang
Go 入门教程
Go Web 编程
Gin 使用教程
微服务开发
内功修炼
数据结构与算法
网络协议
微服务从入门到实践
高性能 MySQL 实战
高性能 Redis 实战
Laravel 消息队列实战
Laravel 从学徒到工匠
PHP 设计模式系列
名企面试指南
资源库
Laravel 资源大全
Laravel 开源项目
Laravel 扩展包
Laravel 资源下载
更多
博客 & 新闻
问答 & 讨论
Leetcode 题解
学院君读书笔记系列
关于 Laravel 学院
Laravel 互助学习群
Golang 互助学习群
更多
Laravel 中文文档
Laravel 全栈教程
Laravel 学习路径
Go 入门教程
程序员内功修炼
博客
问答
搜索
注册
登录
Info
Content
章节导航
Laravel 5.1 基础教程
目录索引
安装篇
3篇文章
在 Windows 中安装 Laravel 5.1.X
在 Windows 上进行 Laravel Homestead 安装、配置及测试
在 Laravel Homestead 中使用 Blackfire Profiler 对应用性能进行分析
基础篇
8篇文章
HTTP路由实例教程(一)—— 基本使用及路由参数
HTTP路由实例教程(二)—— 路由命名和路由分组
HTTP路由实例教程(三)—— CSRF攻击原理及其防护
中间件实例教程 —— 中间件的创建使用及中间件参数定义
HTTP控制器实例教程 —— 创建RESTFul风格控制器实现文章增删改查
HTTP 请求实例教程 —— 获取请求数据、Cookie及文件上传处理
HTTP响应实例教程 —— 基本使用、生成Cookie、返回视图、JSON/JSONP、文件下载及重定向
Laravel 视图实例教程 —— 在视图间共享数据及视图Composer
底层篇
4篇文章
Laravel 5.x 启动过程分析
Laravel 服务容器实例教程 —— 深入理解控制反转和依赖注入
Laravel 服务提供者实例教程 —— 创建 Service Provider 测试实例
Laravel 门面实例教程 —— 创建自定义 Facades 类
数据库篇
12篇文章
Laravel 数据库实例教程 —— 使用DB门面操作数据库
Laravel 数据库实例教程 —— 使用查询构建器对数据库进行增删改查
Laravel 数据库实例教程 —— 使用查询构建器实现对数据库的高级查询
Eloquent ORM 实例教程 —— ORM概述、模型定义及基本查询
Eloquent ORM 实例教程 —— 模型创建、更新及批量赋值
Eloquent ORM 实例教程 —— 模型删除及软删除相关实现
Eloquent ORM 实例教程 —— 查询作用域和模型事件
Eloquent ORM 实例教程 —— 关联关系及其在模型中的定义(一)
Eloquent ORM 实例教程 —— 关联关系及其在模型中的定义(二)
在 Laravel 框架之外使用数据库查询构建器及 Eloquent ORM
将 Sequel Pro 中已存在的数据表导出为 Laravel 迁移文件
将 MySQL Workbench 中已存在的数据表导出到 Laravel 迁移文件
服务篇
29篇文章
Laravel Spark 牛刀初试 —— 安装、设置及使用
Laravel 实例教程 —— 如何在Laravel 5.1中进行自定义包开发
Laravel 5.1用户认证(一) —— 使用Laravel内置组件快速实现注册登录
Laravel 5.1用户认证(二) —— 使用Laravel内置组件快速实现密码重置
Laravel 5.1用户认证(三) —— 使用Socialite实现GitHub登录认证
Laravel 5.1 中的ACL用户授权及权限检查功能实现教程
Laravel 5.1 中创建自定义 Artisan 控制台命令实例教程
Laravel 支付解决方案之 Laravel Cashier (一)—— 安装配置篇
Laravel 支付解决方案之 Laravel Cashier (二)—— 付费会员&分期付款&生成发票
Laravel 支付解决方案之如何使用支付宝进行支付
Laravel 支付解决方案之如何使用银联支付进行支付
Laravel 支付解决方案之如何使用微信支付进行支付
Laravel 缓存实例教程(一) —— 基于Memcached缓存驱动的配置
Laravel 缓存实例教程(二) —— 基于模型+缓存对文章增删改查进行优化
Laravel中运行Gulp任务的利器 —— Laravel Elixir简介及入门教程
如何在 Laravel 5.1 中使用 Laravel Elixir 集成安装 Bootstrap
Laravel Elixir 深入探究(一):Elixir配置选项、前端资源文件编译及合并
Laravel Elixir 深入探究(二):版本控制、测试套件、任务执行以及自定义任务和扩展
Laravel 5.1中 Redis 的安装配置及基本使用教程
Laravel 5.1 分页功能实现及如何自定义分页样式
Laravel 5.1 中的异常处理器和HTTP异常处理实例教程
基于 Laravel 集成的 Monolog 库对日志进行配置和记录
Laravel 5.1 定义事件、事件监听器以及触发事件实例教程
使用 Laravel 5.1 的文件系统对文件进行存储、移动和删除操作
使用 Laravel 5.1 内置的本地化功能轻松实现多语言支持
在 Laravel 5.1 中使用SMTP驱动实现邮件发送(含附件和图片)详细教程
Laravel 队列系列 —— 基于 Redis 实现任务队列的基本配置和使用
Laravel 5.1 中 Session 数据存储、访问、删除及一次性Session实例教程
Laravel 5.1 测试系列 —— PHPUnit 安装及简单单元测试示例
实战篇
2篇文章
使用 Laravel 纯手工打造一个简单的电子商务网站(一) —— 后台新增商品及前台显示
使用 Laravel 纯手工打造一个简单的电子商务网站(二) —— 用户认证及购物车功能实现
图书
Laravel 5.1 基础教程
服务篇
Laravel 5.1 中 Session 数据存储、访问、删除及一次性Session实例教程
Laravel 5.1 中 Session 数据存储、访问、删除及一次性Session实例教程
由 学院君 创建于7年前, 最后更新于 2年前
版本号 #2
51401 views
24 likes
0 collects
1、Session的由来及其实现
HTTP协议是无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系的。也就是说我们无法在服务器端确认两次请求是否是同一个用户所为,这为我们在一些应用场景中实现在多次请求间记住用户状态带来麻烦,比如电子商务网站,用户浏览商品、加入购物车、下单、购买需要多个请求才能完成,如果在这些请求之间无法记住用户状态,根本无法完成正常的购买行为,为此,引入了Session的概念,其目的就是在请求中记住用户状态。
Session的实现机制有两种,一种是我们通常所见的基于Cookie,即将针对每个用户生成的唯一Session ID存放在Cookie中,然后用户每次请求都会带上这个Session ID,这样服务器端就能判断是否是同一个用户,这种机制需要浏览器支持Cookie(现在的浏览器默认都支持);另一种是将基于URL重写,即将Session ID作为参数放到URL中,这样每次请求也会带上Session ID,当浏览器不支持Cookie时可以使用这种方式。
上述两种实现机制是针对客户端的,服务器端也可以将Session存放到不同介质,常见的存储方式有文件、数据库、Memcached和Redis等。和之前的缓存、队列一样,Laravel也为不同的存储提供了统一的接口,下面我们就来看一下如何在Laravel中实现Session的存储、访问、删除以及更多其它用法。
2、Session配置
Laravel 中 Session 配置文件位于config/session.php,默认设置如下:
return [
'driver' => env('SESSION_DRIVER', 'file'),
'lifetime' => 120,
'expire_on_close' => false,
'encrypt' => false,
'files' => storage_path('framework/sessions'),
'connection' => null,
'table' => 'sessions',
'lottery' => [2, 100],
'cookie' => 'laravel_session',
'path' => '/',
'domain' => null,
'secure' => false,
];
driver配置项用于设置Session存储方式,默认是file,即存储在文件中,该文件位于files配置项配置的路径,即storage/framework/sessions。此外Laravel还支持其它存储方式:
database:将Session数据存放到指定数据表中,该数据表由配置项table设置
memcached:将Session数据存放到Memcached中
redis:将Session数据存放到Redis中
array:将Session数据存放到数组中,该配置仅用于测试环境
要修改driver配置,需要去项目根目录下.env文件修改其中的SESSION_DRIVER选项。
lifetime配置项用于设置Session有效期,默认为120分钟。
expire_on_close配置项用于设置是否在浏览器关闭时立即让Session失效。
encrypt配置项用于配置Session数据是否加密。
lottery配置项用于配置回收Session存放位置。
cookie配置项用于配置存放Session ID的Cookie名称,默认是laravel_session。
path配置项用于配置存放Session ID的Cookie存放路径,默认为项目根目录。
domain配置项用于配置存放Session ID的Cookie存放域名。
secure配置项用于配置是否只有在HTTPS协议下发送Session ID到服务器。
使用数据库存储Session
需要将.env文件中的SESSION_DRIVER修改为database,然后将config/session.php中connection配置修改为mysql(如果使用的数据库是MySQL的话),该配置值对应config/database.php中connections相应数据库配置项,也可以使用默认值null不做修改。
然后需要在项目根目录下运行如下Artisan命令:
php artisan session:table
composer dump-autoload
php artisan migrate
生成存放Session的数据表sessions。
使用Memcached/Redis存储Session
使用Memcached存储Session只需将.env文件中SESSION_DRIVER修改为memcached即可。
使用Redis存储Session需要将.env文件中SESSION_DRIVER修改为redis,然后将config/session.php中connection配置修改为default(对应config/database.php中redis主机配置项),当然也可以使用默认值null不做修改。
这里我们使用默认配置不做改变(使用文件存储Session)。
3、Session 使用示例
其实我们之前已经接触到了Session存储,比如之前的用户登录就会用到,用户登录成功之后会将用户数据存放到Session中。这里我们使用Session存放一些简单的测试数据。
使用帮助函数session
存放Session可以使用全局帮助函数session:
session(['site'=>'LaravelAcademy.org']);
对应Session的访问方法:
$site = session('site');
此外还支持对Session数组操作:
session(['site.xxx'=>'LaravelAcademy.org']);
$site = session('site');
dd($site);
打印结果为:
使用Request实例
以上是快捷存取Session,我们还可以在Request实例上实现对Session更高级的一些操作。
我们可以以这种方式获取所有Session数据:
$sessions = $request->session()->all();
我们可以像这样存取Session数据:
$request->session()->put('site', 'http://LaravelAcademy.org');
if($request->session()->has('site')){
$site = $request->session()->get('site');
dd($site);
此外还可以这样获取Session数据(如果对应Session不存在,返回默认值):
$sitename = $request->session()->get('sitename','Laravel学院');
dd($sitename);
此外还可以使用push方法推送多个数据到Session数组:
$request->session()->push('site.xxx', 'http://LaravelAcademy.org');
$request->session()->push('site.xxx', 'Laravel学院');
if($request->session()->has('site')){
$site = $request->session()->get('site');
dd($site);
对应输出为:
当然我们可以使用如下方式实现异曲同工之效:
$request->session()->put('site.xxx', ['http://LaravelAcademy.org','Laravel学院']);
我们可以使用pull方法获取数据然后将其删除:
$siteid = $request->session()->pull('siteid','LaravelAcademy');
echo $siteid;
$siteid = $request->session()->get('siteid');
echo $siteid;
结果只能打印一个LaravelAcademy。
删除指定Session数据还可以使用forget方法:
$request->session()->put('site.name','Laravel学院');
$sitename = session('site.name');
echo $sitename;
$request->session()->forget('site.name');
$sitename = session('site.name');
echo $sitename;
结果只能打印一个Laravel学院。
还可以通过flush方法一次性删除所有Session数据:
$request->session()->flush();
$sessions = $request->session()->all();
dd($sessions);
打印结果为空数组。
一次性Session数据
所谓一次性数据就是下一次请求中(仅仅是下一次)有效的Session数据,常见的应用场景就是表单验证错误信息。用法也很简单,使用flash方法即可。
比如我们在TestController@session中编写测试代码如下:
public function session(Request $request){
$request->session()->flash('message', '欢迎访问Laravel学院!');
然后在TestController@sessionx中编写测试代码如下:
public function sessionx(){
$message = session('message');
echo $message;
然后在routes.php中定义路由规则如下:
Route::get('test/session','TestController@session');
Route::get('test/sessionx','TestController@sessionx');
在浏览器中访问http://laravel.app:8000/test/session,然后再访问http://laravel.app:8000/test/sessionx,打印出:
欢迎访问Laravel学院!
再次刷新http://laravel.app:8000/test/sessionx,则页面显示空白,说明Session数据已经被销毁,这就是一次性Session数据。
当然,如果我们想要继续保持一次性Session数据有效,可以定义TestController@sessionx代码如下:
public function sessionx(Request $request){
$request->session()->reflash();
$message = session('message');
echo $message;
这样不管怎么刷新Session数据始终有效。此外还可以指定哪些Session数据有效:
$request->session()->keep(['message']);
Laravel
请求
Session
Cookie
数据库
删除
Memcached
Redis
存储
一次性
点赞
取消点赞
收藏
取消收藏
赞赏
分享到以下平台:
<< 上一篇:
Laravel 队列系列 —— 基于 Redis 实现任务队列的基本配置和使用
>> 下一篇:
Laravel 5.1 测试系列 —— PHPUnit 安装及简单单元测试示例
8 条评论
#1
Loser
评论于 6年前
正在删除评论...
当使用memcache时,会出现Class 'Memcached' not found 错误,我查了一下,发现windows开发环境没有对应的memcached.dll,只有memcache.dll,请教windows开发环境如何使用memcached
#2
学院君
评论于 6年前
正在删除评论...
所以才让大家使用Homestead作为本地开发环境啊 T_T
#3
Loser
评论于 6年前
正在删除评论...
Orz...我配置了homestead,而且通过phpinfo()也看到了memcached的相关enable信息,就是本地phpstorm在执行一些命令行比如composer update时,也会报这样的错误,所以想看看windows环境有没有解决方案,现在看来好像没有。。。
#4
idong杨
评论于 6年前
回复 #2
正在删除评论...
自己去本地安装一个memcache去啊 ,都告诉你没有了.....
#5
黑客丶权杖
评论于 6年前
正在删除评论...
报错:Session store not set on request.
代码:public function register(Request $request){
$request->session()->all();
然后我直接用session来存数据 存完直接echo session('register_msg_code')是存在的
session(['register_msg_code' => $code]);
但是在其他页面 得到的结果就是一个null
求解啊T_T
#6
jk
评论于 5年前
回复 #8
正在删除评论...
可以看见,在调用完controller之后,调用了session->save()的方法,来主动的保存session。这样session才能落地保存起来,如果在controller或者view里面写了exit;,
那么session是不会被保存的,除非主动的写Session::save()才能手工的保存起来。因此在debug调试的时候千万要注意啊。
#7
gavin
评论于 5年前
正在删除评论...
$request->session()->flash('message', '欢迎访问Laravel学院!');
session()->save();
在另外的action调用$site = session('message'); 依然拿不到值null
#8
mayjay
评论于 5年前
正在删除评论...
一次性缓存输出后,再次刷新为什么还是存在?。。。。。
登录后即可添加评论
升级为学院君订阅用户(新年优惠🎁)
内容导航
1、Session的由来及其实现
2、Session配置
使用数据库存储Session
使用Memcached/Redis存储Session
3、Session 使用示例
使用帮助函数session
使用Request实例
一次性Session数据
相关推荐
Session
Laravel 5.1 中文文档
服务
HTTP 请求实例教程 —— 获取请求数据、Cookie及文件上传处理
Laravel 5.1 基础教程
基础篇
Session
Laravel 5.3 中文文档
HTTP层
Session 实现、配置与使用详解
Laravel 5.5 中文文档
基础组件
Session
Laravel 5.7 中文文档
基础组件
回到顶部
2022 基于 Laravel 6 构建
关于学院
订阅服务
友情链接
站点地图
本站 CDN 加速服务由又拍云赞助