当PHP页面关闭时调用函数

3

有没有办法在php页面关闭时调用函数?
我正在将在线/离线状态保存在MySQL数据库中。
使用我的函数:

Users::isOffline(Users::getUserName())

我正在将“离线”写入数据库。
现在,当有人使用关闭按钮关闭页面时,我想调用此函数。
我尝试过这样做:

<script language="JavaScript" type="text/javascript">
window.onbeforeunload = confirmExit;
function confirmExit()
{
var offline= <?php echo Users::isOffline(Users::getUserName())?>;
}
</script>

但是,当加载php页面时,函数被调用了... 有什么想法? :)

1
只是好奇,你不使用类似于“last_activity”时间的原因是什么?这是一个游戏吗?还是其他什么? - Clay
@ChrisBanks 不是的,这是一个带有文件浏览器的网站。我正在使用last_activity_time...但我也想使用在线/离线状态 :) - npit
4个回答

4

这是因为PHP代码无法在客户端运行 - 你需要使用JS。

function confirmExit(){
//here you send request to your server
}

在服务器端,您将接收请求并将用户标记为离线。


1
@npit Java != JavaScript - online Thomas
@ManasovDaniel,你能再解释一下吗?这应该是什么样子的? - npit
@npit,正如Thomas所说,Java不是JavaScript,就像茶不是茶壶。 - Manasov Daniel
@npit 当你收到请求时,可以调用 Users::isOffline(Users::getUserName())。我不知道你的应用程序内部是什么,所以无法解释更多 ;) - Manasov Daniel
@ManasovDaniel 哦,现在我明白你的想法了...它已经是JS <script language="JavaScript" type="text/javascript"> - npit
显示剩余4条评论

2
在页面关闭之前,您可以将用户信息发布到另一个php文件中。按钮应该是这样的:
<button type='button' data-userid='<?php echo Users::isOffline(Users::getUserName())?>'>click1</button>

你可以将userid发送到一个php文件中以更新状态。
$('button').click(function(){
    var userid = $(this).attr('data-userid';
    $.ajax({
      type: "POST",
      url: "gooffline.php",
      data: {userid: userid},
      success: function(data)
      {
          alert("Come back soon!");
      }
   });
});

PHP文件将会是这样的:

$userid = $_POST["userid"];
$status = userLoggingOut($userid); //your db update function
if($status){
    echo json_encode(array("status"=>"success","message"=>"user info updated"));
}

希望这能解决问题。


2
您无法这样做,因为PHP可能在后端执行,您可以通过以下方式实现所需结果:
首选方法: 如果您需要正确地完成,请参阅@Philip Andersson的答案。您还可以在创建具有PHP jQuery Websocket的实时组教程中了解如何使用Websockets。
解决方法: 您想要实现的内容可以通过以下步骤完成:
1. 创建一个PHP文件,在处理来自您的浏览器的请求时执行Users :: isOffline(Users :: getUserName()) 2. 创建JavaScript处理程序 onbeforeunload ,该处理程序将向上述新创建的PHP文件发送 Ajax 请求。 技巧性问题:从onbeforeunload处理程序发送Ajax请求不是一件简单的事情。请使用下面提供的代码进行操作:
window.onbeforeunload = function() {
    var x = sendUserOfflineAjax();
    return x;
};

function sendUserOfflineAjax(){
        // Perform sending ajax request
}

我尝试了这个代码:<script language="JavaScript" type="text/javascript">window.onbeforeunload = function() { var x = sendUserOfflineAjax(); return x; };function sendUserOfflineAjax(){ xhttp.open("GET", "logout.php?name=<?php echo User::getUserName(); ?>", true); xhttp.send(); } </script> 但它没有起作用... - npit
好的,我在包含AJAX方面又犯了一个错误。您发送AJAX请求的解决方案非常有效。谢谢。 - npit

2
您要尝试实现的内容仅使用PHP和JavaScript并不容易。通常,当您想要进行良好的在线/离线状态检查时,需要使用Websockets。
有一个名为Pusher的免费订阅服务,我已经使用过多次,它非常容易设置。
此外,您可以在这里阅读如何设置在线/离线状态: 使用Websocket和Pusher显示连接用户登录状态

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