草庐IT

PHP session 过期

coder 2024-04-29 原文

关于 PHP session 过期的问题。

如果该用户有一段时间不活动(出于测试目的,5 秒),我需要我的服务器丢弃 session 信息。

我看过this question尤其是 Gumbo(+28 票)的回答,我一直在想这个答案对于不活跃用户的可​​行性。在我的网站上,我已经实现了这个建议并且它工作正常,只要用户在 session 过期后至少请求一次数据。但不活跃用户的问题在于他们不请求新数据。因此永远不会调用过期代码。

我一直在查看 session.gc_maxlife 和我的 PHP.ini 中的相关参数,但我无法按照我希望的方式进行这项工作。

关于这个问题有什么建议吗?

最佳答案

session expiration logic I mentioned确实已经做了您期望的事情: session 一旦过期就不能使用。

session数据还在storage中无所谓,过期就不能用了;下次垃圾收集器运行时,它将被删除。这发生的概率为 session.gc_probability除以 session.gc_divisor在每个 session_start 调用中(另请参见 How long will my session last?)。


编辑 由于您想在过期的 session 上执行一些额外的任务,我宁愿建议使用 custom session save handler .

当使用一个类作为 session 保存处理程序时,您可以编写两个类,一个用于基本的保存处理程序,另一个带有扩展的垃圾收集器来执行额外的任务,例如:

interface SessionSaveHandler {
    public function open();
    public function close();
    public function read($id)
    public function write($id, $data);
    public function destroy($id);
    public function gc($callback=null);
}
class SessionSaveHandler_WithAdditionalTasks implements SessionSaveHandler {
    // …
    public function gc($callback=null) {
        if (!is_null($callback) && (!is_array($callback) || !is_callable($callback))) return false;
        while (/* … */) {
            if ($callback) $callback[0]::$callback[1]($id);
            // destroy expired sessions
            // …
        }
    }
    public static function doAdditionalTasksOn($id) {
        // additional tasks with $id
    }
}
session_set_save_handler(array('SessionSaveHandler_DB_WithAdditionalTasks', 'open'),
                         array('SessionSaveHandler_DB_WithAdditionalTasks', 'close'),
                         array('SessionSaveHandler_DB_WithAdditionalTasks', 'read'),
                         array('SessionSaveHandler_DB_WithAdditionalTasks', 'write'),
                         array('SessionSaveHandler_DB_WithAdditionalTasks', 'destroy'),
                         array('SessionSaveHandler_DB_WithAdditionalTasks', 'gc')
                         );

关于PHP session 过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3636741/

有关PHP session 过期的更多相关文章

  1. ruby - 执行过期异常使 Ruby 线程崩溃,但处理了 Timeout::Error - 2

    任何人都可以解释为什么当对方法的调用看起来像这样时我可能会看到这个堆栈(由HTTParty::post请求引起):beginresponse=HTTParty::post(url,options)rescuelogger.warn("Couldnotpostto#{url}")rescueTimeout::Errorlogger.warn("Couldnotpostto#{url}:timeout")end堆栈:/usr/local/lib/ruby/1.8/timeout.rb:64:in`timeout'/usr/local/lib/ruby/1.8/net/protocol.rb

  2. Ruby - 执行已过期 - 2

    我有这样的ruby​​代码:begindoc=Nokogiri::HTML(open(url).read.strip)rescueException=>exlog.error"Error:#{ex}"end我得到的日志是:ERROR--:Error:executionexpired我想要block重新执行直到它成功。我该怎么做? 最佳答案 我会稍微扩展一下我的评论。您可以使用retry返回到begin:begindoc=Nokogiri::HTML(open(url).read.strip)rescueException=>exlo

  3. ruby-on-rails - 如何将 Rails session cookie 过期时间设置为 "session" - 2

    我对Rails中不在表面上的部分不是很有经验。我想要的只是有一个sessioncookie,其过期时间设置为session,这样当用户离开浏览器或其他任何东西时它就会过期。作为安全措施。 最佳答案 默认情况下,cookie是sessioncookie。通过在config/initializers/session_store.rb中提供选项散列,您可以完全控制cookie。选项与Rack::Session::Cookie(seedocs)相同。因此,例如,对于特定的到期日期,您可以提供:expire_after。如果您使用Devise

  4. ruby - 以编程方式设置 Rack session cookie 过期 - 2

    我正在使用Rack尝试在我的Sinatra应用程序中实现“记住我”功能。我可以将sessioncookie设置为在session结束时或X秒后过期,但我想同时执行这两种操作。例如,如果用户点击了“记住我”,那么我希望他们的session在X秒后结束。例如,我的app.rb有一行看起来像这样:useRack::Session::Cookie,:expire_after=>2592000,#30daysinseconds:secret=>MY_SECRET我尝试在用户登录时执行以下操作:if(!remember_me)env['rack.session.options'][:expire_

  5. ruby-on-rails - 如何使控制台中的 View 缓存片段过期? - 2

    有点像Rails.cache.delete('site_search_form')好像不行。这可能吗?谢谢。 最佳答案 ActionController::Base.new.expire_fragment(key) 关于ruby-on-rails-如何使控制台中的View缓存片段过期?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/756888/

  6. ruby-on-rails - Rails 4.0 expire_fragment/缓存过期不起作用 - 2

    我一直在尝试使用Rails的缓存功能,但我无法使某些缓存片段过期,尽管它们似乎已过期。使用Rails教程站点中指出的“俄罗斯娃娃缓存”,我正在使用此配置我在release_controller.rbController中使外部缓存过期,我在其中使用expire_fragment("all_available_releases")使片段过期。我在更新、删除或添加条目的Controller的每个方法中都使用它。这是WEBrick的日志,尽管过期片段已在其中注册,但5行后过期片段被读取并使用,而这是不应该的。这个例子是在destroy调用之后。ProcessingbyReleasesCont

  7. javascript - 如何让这个 cookie 在 14 天后过期 - 2

    functionsetcookie(cookieName,cookieValue,nDays){vartoday=newDate();varexpire=newDate();if(nDays==null||nDays==0)nDays=1;expire.setTime(today.getTime()+3600000*24*nDays);//changedthatto*14document.cookie=cookieName+"="+escape(cookieValue)+";expires="+expire.toGMTString();}functionreadcookie(cooki

  8. javascript - 如何读取 cookie 创建日期(不是过期时间) - 2

    有没有办法在变量中存储cookie创建日期?我正在使用jquery.cookie插件。如果没有办法,我正在考虑将实际时间/日期作为值存储在cookie中。这可能是一个解决方案。谢谢。 最佳答案 您确实需要将时间存储在cookie本身中。浏览器的cookieAPI不提供创建日期作为元数据。 关于javascript-如何读取cookie创建日期(不是过期时间),我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  9. javascript - 如何设置 JavaScript cookie 在 10 年后过期? - 2

    我在这部分代码中使用的函数设置了cookie过期时间:time+=3600*1000;一小时后过期。怎么设置10年后过期? 最佳答案 注意:自2017年6月23日上午9:04:01起,toGMTString()已弃用,不应再使用。它的实现只是为了向后兼容;请改用toUTCString()。更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toGMTStringvarCookieDate=newDate;

  10. javascript - 在 Javascript 中缓存和预取过期的 promise - 2

    Promises是我在Javascript中管理异步代码的首选方式。Memoize(npm上的memoizee)是一个Javascript库,用于轻松缓存和预取函数结果。理想情况下,我想结合两者的优点,并且能够“过期”一个Promise并预取一个新的Promise结果(当缓存被触及并接近过期时)。Memoize可以做到这一点,但它并没有考虑到Promises。(我知道Promises有一个内置的“永远缓存”,这是它们的本质,但是永远对我的应用程序来说太长了)到目前为止,我最好的尝试如下(使用bluebird、memoize和underscore的node.js示例):varmemoiz

随机推荐