【问题标题】:PHP extend garbage collectorPHP扩展垃圾收集器
【发布时间】:2014-05-09 11:07:40
【问题描述】:

我需要扩展 php 的垃圾收集器,因此当它删除旧会话时,它还应该删除一些数据库条目。我尝试过使用 SessionHandlerInterface 的实现,但它不起作用。我应该在哪里添加我的代码?是否有可能或这些实现与标准 session_destroy 调用有关,而不是垃圾收集器销毁?

【问题讨论】:

    标签: php garbage


    【解决方案1】:

    session_set_save_handler 函数允许您在许多会话事件(打开、关闭、读取、写入、销毁和 gc)上附加回调。在您的情况下,destroy 和/或 gc 可能会这样做。

    【讨论】:

    • 这两种方法我都试过了,好像没有被调用。你能举个例子吗?
    • 这里是一个很好的实现gc方法的例子:here
    • 我不需要更改整个处理程序进程,只需在垃圾收集器删除会话时多做一步。我想保留当前保存到文件夹的功能。
    • 检查我的代码,问题是没有写入会话数据,会话已装箱,但我无法在写入方法的 $data 中传递任何内容。通常在使用 $_SESSION['user']='user' 时,它应该触发 $data 变量中包含 'user' 的写入方法。
    【解决方案2】:

    根据documentation:

    销毁会话。由 session_regenerate_id()($destroy = TRUE)、session_destroy() 和 session_decode() 失败时调用。

    因此,使用SessionHandlerInterface 定义的销毁函数只会在脚本期间显式销毁会话或出现错误时调用。

    要销毁旧会话,您必须使用session_set_save_handler 的gc 参数并删除所有带有datetime < currenttime - $lifetime 的条目。


    编辑:

    请注意,在查询开始时调用gc 的概率只有 1%。这意味着它的执行高度取决于您的服务器上有多少流量。当你一个人在测试服务器上工作时,你不能轻易地执行它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 2012-03-13
      • 2011-08-13
      • 2018-12-30
      • 1970-01-01
      • 2011-12-11
      相关资源
      最近更新 更多