【问题标题】:Hitting route without refreshing session在没有刷新会话的情况下击中路线
【发布时间】:2015-04-25 01:34:46
【问题描述】:

我正在使用 Laravel 4 构建我的单页应用程序,我需要实现会话超时,以便在检测到用户后立即重定向,我一直在尝试检查 $_SESSION/Session: :exists() 数组通过一些轮询请求,但每次我点击路由时都会刷新会话。

如何有效地在 Laravel 上实现会话信息轮询?我是否需要做一些更复杂的事情,比如保持开放连接(Websockets/Long pooling)?

我觉得这应该是一个开箱即用的功能,但奇怪的是似乎没有人实现它,是不是因为大多数实现都是页面到页面而不是一页 + ajax?

【问题讨论】:

    标签: php laravel session-cookies polling laravel-routing


    【解决方案1】:

    由于某些人的知识界限,这可能是一个很长的尝试,但我在下面是为了在我的应用程序中显示实时数据,并且值得努力开始使用 NodeJS(而且它比人们认为的全栈 PHP 更容易开发者已经熟悉 JS,强烈推荐进入 MEAN 栈)

    我在 PHP 框架中编写核心功能,对于我需要实时显示或与用户交互的任何内容,而不是轮询或将 php 与 websockets 一起使用,我引入了一个额外的 nodejs nginx 服务器并使用socket.io,这很好,因为它将与您的数据库的连接保持在最低限度(即因此避免了 Mysql 中的任何最大连接问题)并且是超级可扩展的,因为它使用可观察模式而不是轮询,将所有客户端连接保持在一个数组中,并且当观察者看到你的数据持久层发生变化时推送新数据,而不是让你的服务器超级忙,因为无数个烦人的客户端一直在轮询你的数据库。

    如果您还没有这样做,我还建议您为您的 PHP 应用程序服务器删除 apache,并使用 php fpm 查看 Nginx

    【讨论】:

      【解决方案2】:

      这是一个有趣的问题,您应该为此使用中间件。如果您使用的是 laravel 4.1 或更高版本,laravel 使用 StackPHP

      检查来自 fideloper 的 link,它可能有用。

      只需在中间件中设置/更新会话变量(由您定义)并创建不使用 API 中的中间件的路由来查询该变量。

      【讨论】:

        【解决方案3】:

        据我所知,它在 Laravel 中并没有开箱即用,但它实际上很容易实现。举个例子:您可以使用Session::put('logintime', time()); 将用户登录的时间存储在会话变量中,然后检查是否有超时。

        示例(超时 15 分钟):

        function isTimeout() {
            return !Session::has('logintime') || Session::get('logintime') + (15 * 60) <= time();
        }
        

        然后您可以根据需要使用它来响应 AJAX 请求。

        【讨论】:

        • 我认为这并不能解决我的问题,因为我需要在用户采用的每条路线上继续注册该时间(每次请求都会刷新会话),如果我使用 App::before 这样做所有路由都会更新计时器,这将再次出现同样的问题,创建一个过滤器并将其放置在除超时路由之外的所有路由之外,因为它会使创建新路由成为不熟悉我们的新开发人员的问题代码。
        • 你使用哪个 Laravel 版本?使用 Laravel 5,您可以只使用中间件
        • 目前使用 Laravel 4.2.17
        猜你喜欢
        • 2020-01-14
        • 2019-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-15
        • 1970-01-01
        • 2019-04-12
        • 2012-07-17
        相关资源
        最近更新 更多