2

我有一个用作管理面板的 Web 应用程序。它有一个实时聊天选项,可以与另一端的作家(员工)联系。Web 应用程序使用以下 PHP 代码检查在线作者。

$q = 0;
$lasttime = isset($_POST['timestamp']) ? $_POST['timestamp'] : 0;
while ($q<5){
    sleep(3);
    $wresult = $db->query("SELECT writer_alias FROM tblwriter WHERE writer_isactive=1 AND (UNIX_TIMESTAMP(NOW())-last_activity)<10");
    if ($wresult->num_rows){ break; }
    ++$q;
}
if ($wresult->num_rows){
    while ($row = $wresult->fetch_object()){ $writers[] = $row; } 
    $wresult->free(); 
}
echo json_encode(
    array(
        "writers" => $writers,
        "now" => time()
    )
);

在应用程序上,以下 javascript 代码处理 PHP 响应并再次调用 ajax 以完成循环。

function UpdateCHAT(){
    $.ajax({ 
        type: "POST", 
        url: "liveserver.php", 
        data: {update:"1",timestamp:lastime}, 
        success: 
            function(data1){
                if (data1 == null){ 
                    $(".onlinechat i").removeClass("icon-white"); 
                }else{ 
                    lastime = user_signin = Number(data1.now);
                    if (!data1.writers.length){ 
                        $(".onlinechat i").removeClass("icon-white"); 
                    }else{
                        $(".onlinechat i").removeClass("icon-white");
                        $.each(data1.writers,function(j) {
                            $("#writer_"+data1.writers[j].writer_alias).find("i").addClass("icon-white");
                        }); 
                    }
                }
            }, 
        dataType: "json",
        timeout: 60000,         
        complete: 
            function(){
                UpdateCHAT(); 
            }
        }
    );
}

一切都很好,除了我想不出一种方法来了解离线作家,因为 PHP 代码旨在检查在线作家,但这意味着如果作家曾经在线,他将保持在线(在application) 直到 PHP 代码终止并返回空的 writer。

希望我能解释我的观点。这个问题更多地与想法有关,而不是与代码有关。任何输入表示赞赏。

谢谢。

4

1 回答 1

0

使 PHP 代码总是在一段时间后(比如 2 分钟)返回一个空结果集(即没有新的聊天行)。

然后 JS 将立即执行一个新请求。如果没有,那么用户就处于离线状态。保留last_request时间戳,如果它超过 2+e 分钟,则用户离线。


您可以尝试在 PHP 中检测连接何时关闭。设置ignore_user_abort(true)以便您可以控制脚本何时终止。然后用于connection_aborted()检查客户端是否关闭。如果他知道你知道他离开了。

如果用户打开了两个窗口,则会出现潜在问题:关闭一个窗口并不意味着他离开了,但这可能是可以接受的;用户会闪烁一会儿。


另一种解决方案是使用单独的 ping 请求,它只会告诉您“是的,我还在这里”。如果您有一段时间没有获得其中之一,则用户可能处于离线状态。

于 2013-11-06T10:41:54.700 回答