2010-07-29 55 views
1

我想要一个函数在会话被销毁时运行。我研究过使用session_set_save_handler,但我不想手动处理会话的存储,我只是想在它们被销毁时做一些处理。有没有办法做到这一点,而不使用session_set_save_handler?当会话被破坏时注册一个函数在PHP中运行

回答

1

处理程序几乎是我想的唯一方法。一个会话也可以作为垃圾收集的一部分被销毁,并且这两个只能通过使用我所知道的session_set_save_handler来拦截。

0

你可以用register_shutdown_function()做到这一点。该脚本退出时执行该功能。

编辑:由于我上面的答案被认为是不正确的,我正在编辑以给出更好的答案。在致电session_destroy()之前或之后,您可以拨打您喜欢的任何功能。只有在您明确呼叫session_destroy()时,会话才会被删除。请注意,如果系统管理员设置了一个cron作业,PHP也会清除过期的会话,但是您无法从php脚本中影响该清理。

+0

如果在脚本的末尾清理会话,会有什么用? :) – Blizz 2010-07-29 18:36:04

+0

在第一次阅读时犯了同样的错误。会话被破坏或会话关闭确实是不同的事情。 – Wrikken 2010-07-29 18:38:21

+0

似乎我们确实犯了一个错误。我已经修改了我的答案。希望它是帮助。 – jmz 2010-07-29 19:05:56

0

我看到它是把垃圾的处理,并做自己的唯一方式。不适用于基于memcached的会话,但文件会话很容易追踪/加载/移动(只需查找最近在会话目录中访问的文件)。

0

如果你没有手动管理会话,那么他们极有可能作为文件存储,像Wrikken说,你可以自己用cron作业删除旧的会话文件。

但真的,这是垃圾收集器的工作。整个session_set_save_handler不是很难使用。你可以安装一个现成的,只需在垃圾收集器被调用时触发你的函数。

0

这东西是很容易在有充分的应用平台,如Java,.NET等。例如你有一个由服务器在启动,应用程序启动时,会话结束,解雇等事件有了其他语言完成PHP没有像其他语言一样的“应用程序”的真正概念,所以你没有那些由应用程序服务器触发的事件。但有些东西可以手动完成。

大概最容易做的事情是简单地时间戳的数据库记录被记录在每个页面加载每个用户。然后,您将运行cron作业以查找已过期的时间戳(意味着用户在20分钟内没有加载另一个页面 - 或者任何超时时间)。然后你可以做任何必要的行动。这样做的好处在于,您可以编写一些内容来监视哪些用户在任何特定时刻登录了系统。

另一个想法是,你实际上可以在服务器上写的东西通过包含会话文件的PHP目录看。然而,将这些与用户匹配可能会很困难。