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コードはオンラインライターをチェックするように設計されているため、オフラインライターを知る方法が思いつかないという事実を除いて、すべて正常に機能していますが、これは、ライターが一度オンラインになった場合、オンラインのままになることを意味します( PHP コードが終了し、空のライターが返されるまで。

私の要点を説明できることを願っています。この質問は、コードの一部ではなく、アイデアに関するものです。どんな入力でも大歓迎です。

ありがとう。

4

1 に答える 1

0

PHP コードが常に一定時間 (2 分など) 後に空の結果セット (つまり、新しいチャット行がない) を返すようにします。

JS はすぐに新しいリクエストを行います。そうでない場合、ユーザーはオフラインです。タイムスタンプを保持します。last_requestタイムスタンプが 2+e 分より古い場合、ユーザーはオフラインです。


PHPで接続がいつ閉じられるかを検出しようとすることができます。ignore_user_abort(true)スクリプトがいつ終了するかを制御できるように設定します。次にconnection_aborted()、クライアントが閉じたかどうかを確認するために使用します。彼が去ったことを知っていれば。

ユーザーが 2 つのウィンドウを開いている場合、問題が発生する可能性があります。ユーザーはほんのしばらくブリップします。


もう 1 つの解決策は、「はい、私はまだここにいます」というだけの別の ping 要求を使用することです。しばらくそれらのいずれかを取得していない場合、ユーザーはおそらくオフラインです。

于 2013-11-06T10:41:54.700 に答える