如何检查浏览器与服务器的连接仍然处于活动状态?

3

当发生资金转移时,如果浏览器关闭会发生什么?

我的意思是,在服务器上进行处理时,在提交所有更改之前,我想检查客户端是否仍然在线。如果突然关闭浏览器,则撤消更改。

我的代码如下:

function some(){
 do_some_stmt;//also keep track what changes has been done
 do_some_stmt;//also keep track what changes has been done
 ...............

if(connection_is_still_alive()){

// final commit
}else{
  undo_the_previous_changes();
}
}

所以你可以用php、java来回答,我认为如果可能的话,那么设计用于客户端-服务器架构的所有编程语言都可以实现。

基本上我想知道在脚本中间是否有可能检查浏览器仍然在线?

欢迎提出任何建议,先感谢您使我理解。

2个回答

0

不要像Paul L的答案中使用日志文件,而是可以使用一个带有时间戳的会话变量进行更新,并检查该变量是否小于或等于/略大于您的更新间隔。

但是您永远无法确定用户在毫秒之前是否关闭了浏览器。

您可以让来自浏览器的JavaScript调用接收服务器的答复:已完成/未完成,当接收到已完成时,让用户通过按下现在可见的按钮来确认交易(在给定时间内,否则您应该进行回滚)。


0
你可以编写一个JavaScript函数,以一定的时间间隔加载一个PHP页面。
代码示例:
创建3个文件:file.js、onlinecheck.php和log.txt。

file.js:

function tellTheServerThatIAmStillHere() {
  $.post('onlinecheck.php', {onlineStatus: iAmStillHere}); /* Sends a post to the file onlinecheck.php with the parameter "onlineStatus: iAmStillHere" */
  timer = window.setTimeout(tellTheServerThatIAmStillHere,8000); /* sends a new post every 8 seconds */
}

onlinecheck.php:

<?php
  if(isset($_POST["onlineStatus"])) {
    if($_POST["onlineStatus"] == "iAmStillHere") {
      $fd = fopen("log.txt", "w");
      fwrite($fd, date("[d.m.Y - H:i:s] ").$_SERVER['REMOTE_ADDR'].": He is still here"); //Puts out something like "[26.03.2014 - 13:57:33] 127.0.0.1: He is still here"
      fclose($fd);
    }
  }

现在,如果您是这个意思,可以在日志文件中检查浏览器是否仍然在线。

这是一个解决方案,但如果我写在log.txt上,会有100个并发调用,因此存在解析和文件大小问题。如果我将数据保存在数据库中而不是log.txt中,则在大表中存在额外的查询问题,或者我应该每天清理表格... 我认为应该有一种最简单的方法,就像客户端发送命中服务器那样发送到该连接。 - Fisherman
嗯,onlinecheck.php是我想到的最简单的解决方案。您可以将数据保存到数据库中,然后检查IP地址是否已经有记录,如果有的话就覆盖它。 - Paul L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接