我想在会话被销毁时运行一个函数。我已经研究过使用session_set_save_handler,但我不想手动处理会话的存储,我只想在它们被销毁时进行一些处理。有没有办法在不使用session_set_save_handler的情况下执行此操作?
答案 0 :(得分:1)
处理程序几乎是我认为的唯一方法。会话也可以作为垃圾收集的一部分进行销毁,并且只能使用我所知道的session_set_save_handler拦截这两个会话。
答案 1 :(得分:0)
您可以使用register_shutdown_function()执行此操作。该脚本退出时执行该函数。
修改:由于上面的答案被认为是错误的,我正在编辑以提供更好的答案。您可以在致电session_destroy()
之前或之后拨打您喜欢的任何功能。只有在您明确调用session_destroy()
时才会删除会话。请注意,如果系统管理员设置了一个cron作业,PHP也会清除cron作业中的过期会话,但是你无法从php脚本中影响该清理。
答案 2 :(得分:0)
我看到的唯一方法是转动垃圾处理,并自己做。对于基于memcached的会话不起作用,但文件会话很容易跟踪/可加载/可移动(只查找最近在会话目录中访问的文件)。
答案 3 :(得分:0)
如果您不是手动管理会话,那么它们很可能存储为文件,就像Wrikken所说,您可以使用cron作业自行删除旧的会话文件。
但实际上,这是垃圾收集器的工作。并且整个session_set_save_handler并不难以使用。您可以安装现成的,只需在调用垃圾收集器时触发您的函数。
答案 4 :(得分:0)
这是在其他语言中轻松完成的,这些语言具有完整的应用程序平台,如Java,.NET等。例如,您在启动,应用程序启动,会话结束等时都有服务器触发的事件。使用PHP没有与其他语言具有相同意义的“应用程序”的真实概念,因此您没有应用服务器触发的那些事件。但有些事情你可以手动完成。
可能最简单的方法是简单地为每个页面加载时登录的每个用户的DB记录加时间戳。然后你运行一个cron作业来查找已经过期的时间戳(意味着用户在20分钟内没有加载另一个页面 - 或者你的超时是什么)。然后,您可以执行任何必要的操作。一个很好的奖励是,您可以编写一些内容来监控哪些用户在任何特定时刻登录到您的系统。
另一个想法是,您实际上可以在服务器上写一些内容来查看包含会话文件的PHP文件夹。然而,将这些与用户匹配可能会很困难。