PHP在页面关闭时执行代码

时间:2011-02-01 15:34:54

标签: php

我试图找到一个用户关闭页面后执行某些PHP代码的方法。在我的应用程序中,一旦用户关闭或导航离开页面,服务器将在数据库中将用户声明为“离线”。这需要代码知道用户何时离开页面。我的应用程序也有无尽的负载(即它会一直睡到用户关闭页面)。

修改

感谢您的回答。我决定使用Pekka的会话方法,因为这对我的应用来说似乎是最符合逻辑的。

干杯

6 个答案:

答案 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执行任何操作:

Capture event onclose browser

// Javascript code
window.onclose = closing;

function closing(){
  $.ajax({
     url: 'yoururl.php',
     data: yourdata,
     success: function(content){
          // empty
     }
  })
}

答案 4 :(得分:0)

答案 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