【问题标题】:Changing session file names in Laravel 5.1在 Laravel 5.1 中更改会话文件名
【发布时间】:2016-01-11 07:08:13
【问题描述】:

所以当有人访问 /storage/framework/sessions 文件夹中的网站时,Laravel 会保存它自己的会话文件。每个会话文件的名称都是随机生成的字母数字唯一名称。但是,我想以某种方式重命名文件并为它提供我自己的自定义名称。我有两种选择。

  • 创建会话文件后手动更改文件名(通过创建、复制、替换)
  • 找到随机生成字母数字名称的函数,并用我自己为每个文件设置唯一名称的方式更改它(这种方法可能不太复杂)

我的主要最终目标是将每个用户的会话文件重命名为存储在我的数据库中的他们自己的用户 ID。所以名称仍然是唯一的,唯一的区别是我可以比使用随机字母数字名称更轻松地搜索文件。

因此,如果有人知道我可以如何执行上述任何方法,或者您可以想出更好的方法来实现相同的目标,那就太好了。任何帮助是极大的赞赏!

编辑:决定在这里更新我最终决定做的事情。我决定不使用 Laravel 生成的内置会话文件,并意识到创建自己的文件并让每个客户端访问它会更容易。谢谢大家!

【问题讨论】:

    标签: php session laravel-5.1


    【解决方案1】:

    Laravel 有几个 Manager 类来管理 基于驱动程序的组件。这些包括缓存、会话、 身份验证和队列组件。经理类负责 用于创建基于特定驱动程序的实现 应用程序的配置。例如,SessionManager 类可以 创建文件、数据库、Cookie 和其他各种实现 会话驱动程序。

    这些管理器中的每一个都包含一个可用于 轻松将新的驱动程序解析功能注入到管理器中。

    要使用自定义会话驱动程序扩展 Laravel,我们将使用 扩展方法来注册我们的自定义代码:

    您应该将会话扩展代码放在 AppServiceProvider 的引导方法中。

    实现 SessionHandlerInterface

    app/Providers/AppServiceProvider.php

    <?php
    namespace App\Providers;
    
    use Session;
    use Illuminate\Support\ServiceProvider;
    use App\Handlers\MyFileHandler;
    
    class AppServiceProvider extends ServiceProvider
    {
        public function boot()
        {
            Session::extend('file', function($app)
            {
                return new MyFileHandler();
            });
        }
    }
    

    请注意,我们的自定义会话驱动程序应实现SessionHandlerInterface。这个接口只包含我们需要实现的几个简单方法。

    app/Handlers/MyFileHandler.php

    <?php
    namespace App\Handlers;
    
    use SessionHandlerInterface;
    
    class MyFileHandler 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) {}
    
    }
    

    或者您可以从 FileSessionHandler 扩展 MyFileHandler 并覆盖相关方法。

    扩展 FileSessionHandler

    app/Providers/AppServiceProvider.php

    <?php
    namespace App\Providers;
    
    use Session;
    use Illuminate\Support\ServiceProvider;
    use Illuminate\Session\FileSessionHandler;
    use App\Handlers\MyFileHandler;
    
    class AppServiceProvider extends ServiceProvider
    {
        public function boot()
        {
            Session::extend('file', function($app)
            {
                $path = $app['config']['session.files'];
                return new MyFileHandler($app['files'], $path);
            });
        }
    }
    

    app/Handlers/MyFileHandler.php

    <?php
    namespace App\Handlers;
    
    use Illuminate\Filesystem\Filesystem;
    use Illuminate\Session\FileSessionHandler;
    
    class MyFileHandler extends FileSessionHandler
    {
        public function __construct(Filesystem $files, $path)
        {
            parent::__construct($files, $path);
        }
    }
    

    您可以在扩展框架文档的会话部分找到更多信息。

    https://laravel.com/docs/5.0/extending#session

    【讨论】:

    • 感谢您的回复。但是,文件的命名究竟发生在哪里?它是引导功能中的“myfile”部分吗?如果是这样,通过在那里使用“myfile”,它不会是所有会话文件的静态名称,因为我怀疑 boot 会被多次调用吗?我错过了什么吗?
    【解决方案2】:

    如果您的最终目标是搜索会话文件名;你不需要改变它们。 您可以将会话文件名保存在数据库表(或您选择的其他文件)中。您可以使用this link 获取文件名。

    一列 -> 存储会话文件名

    其他列 -> 存储您想要的其他信息

    通过这种方式,您可以使用 SQL 更快地搜索和查找文件。

    【讨论】:

    • 当然,这是另一种选择。但这涉及创建新文件并将会话信息存储在其中或数据库中。我的要求将需要我连续运行查询以从数据库中检索,几乎每 5-10 秒一次。文件可能更快,但我想如果我可以通过任何方式访问现有文件,为什么要创建新文件并做同样的事情?
    【解决方案3】:

    为请求使用中间件

    \Illuminate\Session\Middleware\StartSession::class
    
    Route::group(['middleware' => [\Illuminate\Session\Middleware\StartSession::class]], function () {
    
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 2016-02-12
      • 2017-02-27
      • 1970-01-01
      • 2021-01-22
      相关资源
      最近更新 更多