1、简介
由于HTTP驱动的应用是无状态的,所以我们使用Session来存储用户请求信息。Laravel通过干净、统一的API处理后端各种Session驱动,目前支持的流行后端驱动包括 Memcached、 Redis和 数据库。
1.1 配置
Session配置文件位于 config/session.php。默认情况下,Laravel使用的 session驱动为文件驱动,这对许多应用而言是没有什么问题的。在生产环境中,你可能考虑使用 memcached或者 redis驱动以便获取更快的session性能。
session驱动定义请求的Session数据存放在哪里,Laravel可以处理多种类型的驱动:
- file – session数据存储在 storage/framework/sessions目录下;
- cookie – session数据存储在经过加密的安全的cookie中;
- database – session数据存储在数据库中
- memcached / redis – session数据存储在memcached/redis中;
- array – session数据存储在简单PHP数组中,在多个请求之间是非持久化的。
注意:数组驱动通常用于运行测试以避免session数据持久化。
1.2 Session驱动预备知识
数据库
当使用 databasesession驱动时,需要设置表包含 session项,下面是该数据表的表结构声明:
Schema::create('sessions', function ($table) { $table->string('id')->unique(); $table->text('payload'); $table->integer('last_activity');});
你可以使用Artisan命令 session:table来生成迁移:
php artisan session:tablecomposer dump-autoloadphp artisan migrate
Redis
在Laravel中使用Redis session驱动前,需要通过Composer安装 predis/predis包。
1.3 其它Session相关问题
Laravel框架内部使用 flashsession键,所以你不应该通过该名称添加数据项到session。
如果你需要所有存储的session数据经过加密,在配置文件中设置 encrypt配置为 true。
2、基本使用
访问session
首先,我们来访问session,我们可以通过HTTP请求访问session实例,可以在控制器方法中通过类型提示引入请求实例,记住,控制器方法依赖通过Laravel服务容器注入:
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;use App\Http\Controllers\Controller;class UserController extends Controller{ /** * 显示指定用户的属性 * * @param Request $request * @param int $id * @return Response */ public function showProfile(Request $request, $id) { $value = $request->session()->get('key'); // }}
从session中获取数据的时候,还可以传递默认值作为第二个参数到 get方法,默认值在指定键在session中不存在时返回。如果你传递一个闭包作为默认值到 get方法,该闭包会执行并返回执行结果:
$value = $request->session()->get('key', 'default');$value = $request->session()->get('key', function() { return 'default';});
如果你想要从session中获取所有数据,可以使用 all方法:
$data = $request->session()->all();
还可以使用全局的PHP函数 session来获取和存储session中的数据:
Route::get('home', function () { // 从session中获取数据... $value = session('key'); // 存储数据到session... session(['key' => 'value']);});
判断session中是否存在指定项
has方法可用于检查数据项在session中是否存在。如果存在的话返回 true:
if ($request->session()->has('users')) { //}
在session中存储数据
获取到session实例后,就可以调用多个方法来与底层数据进行交互,例如, put方法存储新的数据到session中:
$request->session()->put('key', 'value');
推送数据到数组session
push方法可用于推送数据到值为数组的session,例如,如果 user.teams键包含团队名数组,可以像这样推送新值到该数组:
$request->session()->push('user.teams', 'developers');
获取并删除数据
pull方法将会从session获取并删除数据:
$value = $request->session()->pull('key', 'default');
从session中删除数据项
forget方法从session中移除指定数据,如果你想要从session中移除所有数据,可以使用 flush方法:
$request->session()->forget('key');$request->session()->flush();
重新生成Session ID
如果你需要重新生成session ID,可以使用 regenerate方法:
$request->session()->regenerate();
2.1 一次性数据
有时候你可能想要在session中存储只在下个请求中有效的数据,可以通过 flash方法来实现。使用该方法存储的session数据只在随后的HTTP请求中有效,然后将会被删除:
$request->session()->flash('status', 'Task was successful!');
如果你需要在更多请求中保持该一次性数据,可以使用 reflash方法,该方法将所有一次性数据保留到下一个请求,如果你只是想要保存特定一次性数据,可以使用 keep方法:
$request->session()->reflash();$request->session()->keep(['username', 'email']);
3、添加自定义Session驱动
要为Laravel后端session添加更多驱动,可以使用Session门面上的 extend方法。可以在服务提供者的 boot方法中调用该方法:
<?phpnamespace App\Providers;use Session;use App\Extensions\MongoSessionStore;use Illuminate\Support\ServiceProvider;class SessionServiceProvider extends ServiceProvider{ /** * Perform post-registration booting of services. * * @return void */ public function boot() { Session::extend('mongo', function($app) { // Return implementation of SessionHandlerInterface... return new MongoSessionStore; }); } /** * Register bindings in the container. * * @return void */ public function register() { // }}
需要注意的是自定义session驱动需要实现 SessionHandlerInterface接口,该接口包含少许我们需要实现的方法,一个MongoDB的实现如下:
<?phpnamespace App\Extensions;class MongoHandler implements SessionHandlerInterface{ public function open($savePath, $sessionName) {} public function close() {} public function read($sessionId) {} public function write($sessionId, $data) {} public function destroy($sessionId) {} public function gc($lifetime) {}}
由于这些方法并不像缓存的 StoreInterface接口方法那样容易理解,我们接下来快速过一遍每一个方法:
- open 方法用于基于文件的session存储系统,由于Laravel已经有了一个 file session 驱动,所以在该方法中不需要放置任何代码,可以将其置为空方法。
- close 方法和 open 方法一样,也可以被忽略,对大多数驱动而言都用不到该方法。
- read 方法应该返回与给定$sessionId 相匹配的session数据的字符串版本,从驱动中获取或存储session数据不需要做任何序列化或其它编码,因为Laravel已经为我们做了序列化。
- write 方法应该讲给定 $data 写到持久化存储系统相应的 $sessionId , 例如MongoDB, Dynamo等等。
- destroy 方法从持久化存储中移除 $sessionId 对应的数据。
- gc 方法销毁大于给定$lifetime 的所有 session数据,对本身拥有过期机制的系统如 Memcached 和Redis而言,该方法可以留空。
session驱动被注册之后,就可以在配置文件 config/session.php中使用 mongo驱动了。

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP起源于1994年,由RasmusLerdorf开发,最初用于跟踪网站访问者,逐渐演变为服务器端脚本语言,广泛应用于网页开发。Python由GuidovanRossum于1980年代末开发,1991年首次发布,强调代码可读性和简洁性,适用于科学计算、数据分析等领域。

PHP适合网页开发和快速原型开发,Python适用于数据科学和机器学习。1.PHP用于动态网页开发,语法简单,适合快速开发。2.Python语法简洁,适用于多领域,库生态系统强大。

PHP在现代化进程中仍然重要,因为它支持大量网站和应用,并通过框架适应开发需求。1.PHP7提升了性能并引入了新功能。2.现代框架如Laravel、Symfony和CodeIgniter简化开发,提高代码质量。3.性能优化和最佳实践进一步提升应用效率。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

PHP中使用clone关键字创建对象副本,并通过\_\_clone魔法方法定制克隆行为。1.使用clone关键字进行浅拷贝,克隆对象的属性但不克隆对象属性内的对象。2.通过\_\_clone方法可以深拷贝嵌套对象,避免浅拷贝问题。3.注意避免克隆中的循环引用和性能问题,优化克隆操作以提高效率。

PHP适用于Web开发和内容管理系统,Python适合数据科学、机器学习和自动化脚本。1.PHP在构建快速、可扩展的网站和应用程序方面表现出色,常用于WordPress等CMS。2.Python在数据科学和机器学习领域表现卓越,拥有丰富的库如NumPy和TensorFlow。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

记事本++7.3.1
好用且免费的代码编辑器

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

WebStorm Mac版
好用的JavaScript开发工具

SublimeText3 Linux新版
SublimeText3 Linux最新版