我试图找到一个用户关闭页面后执行某些PHP代码的方法。在我的应用程序中,一旦用户关闭或导航离开页面,服务器将在数据库中将用户声明为“离线”。这需要代码知道用户何时离开页面。我的应用程序也有无尽的负载(即它会一直睡到用户关闭页面)。
修改
感谢您的回答。我决定使用Pekka的会话方法,因为这对我的应用来说似乎是最符合逻辑的。
干杯
答案 0 :(得分:9)
当用户关闭页面时可靠地发送事件几乎是不可能的。有onbeforeunload
事件可以执行Ajax调用,但可能会失败,出于安全原因不执行,或者根本没有执行,因为用户已关闭JavaScript。
这通常通过会话超时来完成:检查上次发出某个会话的请求的时间。如果它超过x分钟前,会话将被视为已过期。这不是一种选择吗?
答案 1 :(得分:4)
页面请求是无状态的,这意味着您永远不会有100%工作检测方法来确定是否有人离开了页面。您可以尝试捕获页面卸载,但这不是100%准确。您也可以尝试使用AJAX提到的@Nayena,但这不太理想。
您最好的选择是像大多数常见网站一样,使用“N分钟内的最后一项活动”作为指标,而不是试图在他们离开或关闭页面时抓住。
答案 2 :(得分:3)
如果你输入一个在5-10秒后刷新的ajax脚本,你可以通过ajax请求调用的php文件更新最后更新的标记,如果它超过10秒,它就会脱机。这肯定是一个更清洁的解决方案: - )
答案 3 :(得分:0)
如果您可以使用Javascript和JQuery,请使用'window.onclose',然后使用Ajax调用使用PHP执行任何操作:
// Javascript code
window.onclose = closing;
function closing(){
$.ajax({
url: 'yoururl.php',
data: yourdata,
success: function(content){
// empty
}
})
}
答案 4 :(得分:0)
使用Body属性onunload
http://www.htmlcodetutorial.com/document/_BODY_onUnload.html
答案 5 :(得分:-1)
只需设置ignore_user_abort(true)
,然后输入
while (!connection_aborted()){
// do nothing ...
}
//after the while loop :
some_function_to_say_that_the_user_is_offline();
但请注意,只要用户导出页面,就会执行该功能。
编辑:浏览器的进度条将永远像“下载...”......
编辑2:同时检查http://www.php.net/manual/en/function.register-shutdown-function.php