0

次のコードは、Webを10分間ロードしますが、その理由はわかりません。

function chatheartbeat(){
    include("config.php");
    $useradn = $_SESSION['displayname'];
    $query = "select * from chat where (userbdn = '".$useradn."' AND isread = 1) order by id ASC";
    $result = mysql_query($query , $link);
    $num_rows = mysql_num_rows($result);
    if ($num_rows >= 1) {
        $items = array();
        $i='1';
        while($chat = mysql_fetch_array($result)){
            $items[$i]['from']=$chat['useradn'];
            $items[$i]['msg']=$chat['msg'];
            $items[$i]['timee']=date("H:i" ,$chat['timee']);
            $i++;
        }
        $query = "update chat set isread = 0 where userbdn = '".$useradn."' and isread = 1";
        mysql_query($query , $link);
        header('Content-type: application/json');
        echo json_encode($items);
        exit;
    }else{
        sleep(2);
        chatheartbeat();
    }
}

助言がありますか?

4

3 に答える 3

2

最初の選択から何らかの結果が得られるまで、関数は戻りません。

結果がなくても、n が実行された後 (たとえば 5) に戻ることをお勧めします。その後、クライアントは ajax 呼び出しを再発行して再度ポーリングできます。

また、これを再帰的に行うのは良い考えではありません。代わりに for ループでこれを行うことをお勧めします。

于 2013-03-01T20:46:30.757 に答える
2

関数を再帰的に呼び出しており、関数呼び出し間でセッション変数が変更されないためelse、最初にその部分に移動すると、毎回そこに移動し、終わりのないループが作成されます。

ちなみに、ポーリングを使いたい場合は、クライアント部分(javascript)でタイマーを設定し、サーバー側で再帰関数を使わないようにします。

于 2013-03-01T20:44:23.260 に答える
1

ロング ポーリング テクニックを実行する際には、いくつかの点に注意する必要があります。

  1. 事前に定義された一定期間後に終了する必要があります。応答するものがあるまでサーバーで待機すると、実行タイムアウトが発生します。

  2. SESSION データで何が起こっているかを把握します。デフォルトでは、PHP はファイル ベースのセッションを使用し、リクエストの過程でファイルをロックします (介入しない限り)。

于 2013-03-01T20:47:17.397 に答える