2011-02-01 108 views
4

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

编辑:

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

干杯

+3

将数据库中的每个用户操作注册为`timestamp`,然后检查用户在最后(n)分钟内是否处于活动状态。这就是每个人都做的,而且是100%工作的唯一途径。 – Shoe 2011-02-01 15:46:58

回答

9

当用户关闭页面时可靠地发送一个事件几乎是不可能的。有可以执行Ajax调用的onbeforeunload事件,但可能会失败,出于安全原因不会执行,或者根本不执行,因为用户关闭了JavaScript。

这通常是通过会话超时完成的:当某个会话的请求最后一次发生时,会检查它。如果时间超过x分钟,会话将视为过期。这不是一个选项吗?

+0

是的,这似乎是最佳做法。你的回答让我更多地思考如何做到这一点,而且看起来似乎比其他提到的方法更符合逻辑。谢谢! – 2011-02-01 16:11:08

3

如果你放入一个在5-10秒后刷新的ajax脚本,你可以通过ajax请求调用的php文件更新上次更新的戳记,并且如果它超过10秒就会脱机。这当然可以是一个更清洁的解决方案:-)

4

页面请求是无状态的,这意味着你永远不会有一个100%的工作检测方法来确定是否有人离开了页面。您可以尝试抓取页面卸载,但这不是100%准确。你也可以尝试使用AJAX提到的@Nayena,但这并不理想。

最好的办法是像大多数常见网站那样做,使用“N分钟内的最后一次活动”作为指标,而不是在他们离开或关闭页面时赶上。

+0

你可以检查用户是否已经从PHP内部浏览页面(不是网站),但这意味着连接将保持打开状态(浏览器中的加载进度将工作到无穷远)..检查我的回答 – 2011-02-01 15:46:36

+0

@Ranan :我也可以使用AJAX推送服务,或者保持活动连接的隐藏闪光插件,或者....(并不意味着它们中的任何一个对于服务器来说都是理想的或者好的)。我将选择“超时”方法,并让我的服务器线程在上述任何一天的任何一天的任何一天打开。 [除非商业模式需要这种开销。但至于“用户离开了吗?” - 不值得资源] – 2011-02-01 15:50:30

+0

)我知道,但他说'执行一些PHP代码'和'我的应用程序也有无尽的负载(即它会睡觉,直到用户关闭页面)。'' ,那为什么不用这个方法? – 2011-02-01 15:54:26

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 
    } 
    }) 
} 
0

只需设置ignore_user_abort(true)然后进入无限while循环的

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