【问题标题】:Is there a way to execute code on session destroy in Laravel?有没有办法在 Laravel 的会话销毁中执行代码?
【发布时间】:2019-06-09 11:55:57
【问题描述】:

我正在尝试为我的自定义 CRM 实施时间跟踪。基本想法是使用切换按钮,这样我就可以为该特定任务存储“start_time”和“end_time”,这两者之间的差异将代表所花费的时间。但是如果用户关闭浏览器或关闭 PC,是否有会话销毁事件,以便我可以在会话销毁后插入“end_time”?

【问题讨论】:

    标签: php laravel session


    【解决方案1】:

    你不能真的依赖 laravel 会话在过期时立即被删除,因为我相信它是基于一个彩票系统,每 100 个请求中就有 1 个清理会话。

    我建议使用 ajax ping 来实现一些东西,这样您就可以知道当用户关闭浏览器时 ping 已经停止。真的没有其他方法可以知道用户是否关闭了浏览器。

    【讨论】:

      【解决方案2】:

      当窗口关闭时,会话不一定被销毁。你可以为onbeforeunload定义一些事件:

      window.onbeforeunload = function(){
         // Send a request to the server to notify it of the window being closed/refreshed
      }
      

      或者您可以按照 Flame 的建议进行一些轮询,但我认为这种方法不干净,因为它会产生一些人们希望避免的网络噪音。

      您还可以建立一个双工通道,例如WebSocket 通道,这样您的服务器就会知道它什么时候坏了。

      【讨论】:

      • 我还没用过onbeforeunload,我想知道它有多稳定,如果你能确保一个ajax-request确实在那里完成
      • @Flame 据我所知它是稳定的,但如果你愿意,你可以做一些实验。至于 AJAX 请求,在窗口关闭时等待 AJAX 请求完成是没有意义的。只发也是可行的。
      • 嗯是的,我猜浏览器可以发送它而忽略响应
      • @Flame 完全正确。如果无法发送请求,则用户在该时间点可能无法访问 Internet。短轮询解决方案具有更准确的潜力,但如果有更多的用户,就会在服务器负载方面付出代价。这就是为什么我认为该解决方案不干净的原因。如果我们想要一个干净的解决方案而不浪费资源,那么将使用 WebSocket 连接。连接中断可以在服务器端捕获,没有任何缺点,WebSocket 连接有更多好处。
      猜你喜欢
      • 2014-10-23
      • 2015-08-16
      • 2016-12-24
      • 1970-01-01
      • 2016-12-26
      • 2016-03-21
      • 2019-12-03
      • 1970-01-01
      • 2020-07-29
      相关资源
      最近更新 更多