如果使用文件或 Redis 驱动程序,Laravel 会话何时会在其生命周期之前过期?因为我的自定义配置有时有效,有时无效

问题描述 投票:0回答:1

我使用自定义会话驱动程序和 config/session_custom.php 文件,有时它工作,有时不工作

在 .env 中,如下所示

SESSION_CUSTOM_DRIVER=redis
SESSION_CUSTOM_LIFETIME=180
SESSION_CUSTOM_COOKIE="${APP_NAME}_custom_session"

我在将数据存储到会话中时使用如下所示

config(['session' => include config_path('session_custom.php)]);
Session::put('custom_cart_data', $data);

所以有时它有效,有时它会在180分钟之前过期

php laravel redis laravel-session
1个回答
0
投票

您在会话在设定的生命周期之前过期时遇到的行为可能归因于多种因素。当使用自定义会话驱动程序(尤其是使用 Redis)并在应用程序中动态配置它时,需要考虑一些关键点和潜在问题:

  1. 动态配置可靠性:使用

    config(['session' => include config_path('session_custom.php')]);
    动态更改会话配置可能并不总是可靠,特别是如果它是有条件地完成或在应用程序生命周期中不够早完成的。会话驱动程序及其设置需要在会话开始之前配置。如果在会话启动后应用此配置,可能不会达到预期效果。

  2. 会话生命周期配置:会话生命周期以分钟为单位设置,您已将其设置为

    180
    。但是,实际的过期时间可能还取决于会话驱动程序(在您的情况下为 Redis)的配置以及它如何处理过期和驱逐策略。例如,如果内存不足,Redis 可能会提前逐出键,具体取决于其
    maxmemory-policy

  3. Cookie 过期:会话 Cookie 的生命周期也是一个因素。确保会话 cookie 的过期时间与所需的会话生存期相匹配。如果 cookie 不再有效,此处的不一致可能会导致会话看起来提前过期。

  4. 应用程序环境:确保

    .env
    文件更改反映在环境中。有时,缓存的配置可能会导致旧值保留。运行
    php artisan config:cache
    可以刷新此设置,但请记住仅在生产中执行此操作,因为它可能会干扰在开发环境中拾取
    .env
    更改。

  5. Redis 配置:确保针对您的用例正确配置 Redis。 Redis 中的

    maxmemory
    设置和逐出策略会影响会话数据的保留时间。如果 Redis 由于内存压力决定提前逐出数据,您的会话将提前结束。

解决这些问题:

  • 早期配置:在应用程序的生命周期中尽早应用会话配置。理想情况下,此配置应该在服务提供商的

    boot
    方法中完成,甚至在 Laravel 的会话处理开始之前完成。

  • 会话驱动程序配置:确保您的会话驱动程序(Redis)在

    session_custom.php
    中正确配置,并且Laravel确实正在使用此配置。调试或记录正在使用的配置可以帮助验证这一点。

  • 调查 Redis 行为:检查 Redis 实例的配置,尤其是驱逐策略和内存限制方面的配置,以确保其符合您的会话数据保留需求。

  • 持久配置:不要动态配置会话驱动程序,而是考虑在配置文件中或通过环境变量静态设置它。这种方法更可靠且可预测。

  • 会话调试:将日志记录添加到应用程序的关键部分以跟踪会话创建、修改和过期。这可以帮助确定会话过期或重新创建的时间和原因。

如果您仍然遇到问题,您可能需要考虑使用 Laravel 的内置会话调试工具或可以更深入地了解会话处理的包。此外,请确保切换会话配置的应用程序逻辑在可预测和可重复的条件下进行,以避免意外的会话丢失。

© www.soinside.com 2019 - 2024. All rights reserved.