我有一个Web应用程序,它在用户会话中存储了一些对象,因此每次向服务器发送AJAX时都不必继续调用数据库。
我想编写一些清理/保存功能,这些功能在用户关闭浏览器选项卡或导航离开页面时触发。
如果用户离开页面,会话是“被破坏”(即调用它包含的任何对象的__destruct) - 或者当用户导航时,使用javascript发送AJAX请求更好地处理此客户端?
答案 0 :(得分:3)
PHP会话是服务器端的事情。如果没有明确地进行AJAX调用或类似操作,客户端浏览器离开页面将不会触发任何服务器端。
答案 1 :(得分:2)
简而言之:不。您必须使用session_destroy()
答案 2 :(得分:2)
PHP中的会话未定义为类。相反,我们有一组session functions来操纵会话。要确保已销毁会话,您需要显式调用:
session_destroy();
如果您尚未销毁会话,会话将在会话超时后执行垃圾收集。垃圾收集取决于以下参数 - session.gc_maxlifetime,session.gc_divisor和session.gc_probability。要确保垃圾收集在每个会话上运行,您必须将session.gc_probability添加到100%。但它肯定会增加服务器的开销,特别是如果你的服务器是高流量服务器的话。
如果您没有明确地跟踪会话并在使用后将其销毁,那么您将部分会话管理留给操作系统。请参阅PHP.net中的说明:
注意:如果您使用的是默认的基于文件的会话处理程序,那么您的 文件系统必须跟踪访问时间(atime)。 Windows FAT可以 不是这样,你将不得不想出另一种处理垃圾的方法 如果您遇到FAT文件系统或其他任何问题,请收集您的会话 其他文件系统,其中atime跟踪不可用。自PHP 4.2.3它使用了mtime(修改日期)而不是atime。因此,对于没有atime跟踪的文件系统,您不会遇到问题 可用。
最好的方法是在浏览器或标签关闭时通过Ajax调用发送标志。您可以通过以下方式检测到它: window.onunload javascript事件。
答案 3 :(得分:0)
如果将任何对象放入$_SESSION
,则在脚本结束时不会调用它们的析构函数,但如果它存在,则当PHP序列化$ _SESSION时,魔术函数__sleep()
是calles。当下一个脚本再次启动会话时,存储的任何对象及其源代码已知(例如,在调用session_start()或使用自动加载之前要求它)将调用__wakeup()
方法。
如果PHP检测到会话在某段时间内处于非活动状态,则只会删除序列化文件。