0

私のウェブサイトのメンバー向けのチャットページを作成しています。チャットの自動更新を除いて、すべてが適切に機能します。チャット ページは 5 秒ごとに新しいメッセージをチェックすることになっており、コールバックを操作すると、この部分が正しく機能していることがわかります。ただし、$.ajax が参照する PHP ファイルは、2 つの非常に異なる動作をもたらします。私が実行したすべてのテストで ajax は正しく機能しているため、ここでは除外しますが、必要だと感じた人がいる場合は追加できます。これは私の注釈付きPHPです:

$new_chat = //new chat message, collected from $.ajax and sanitized
$new_sender = //username of sender, collected from $.ajax and sanitized
$new_time = date('m-d-y');
$most_recent_chat = //unique id# of most recent chat message, collected from $.ajax and sanitized

//This block makes sure that there is a most recent chat; if not, (i.e., the
//page was just loaded so there are no chats on the page) it manually sets one.
//I'm not having any problems with this block.

if (!isset($most_recent_chat)) {
    $query = "SELECT MAX(id) AS 'Most Recent' FROM `chat_global`";
    $check_last_chat = new mysqli($host,$user,$pass,$game_db);

    $check_last_chat->query($query);

    if(!$result = $check_last_chat->query($query)) {
        die();
    }

    while ($row=$result->fetch_assoc()) {
        $most_recent = $row['Most Recent'];
    }
    $most_recent_chat = $most_recent-100;
    $result->free();
    $check_last_chat->close();
}

//Send any new chats to DB

if(isset($new_chat)) {
        //First query inserts new chats into the chat table
        $query = "INSERT INTO `chat_global` (message,sender,time) VALUES ('".$new_chat."','".$new_sender."','".$new_time."');";

        $add_new_chat = new mysqli($host,$user,$pass,$game_db);

        $add_new_chat->query($query);
        $add_new_chat->close();

        //Second query returns all new chats in reference
        //to the most recent chat on the user's browser page

        $query2 = "SELECT * FROM `chat_global` WHERE id>'$most_recent_chat';";

        $most_recent_chats = new mysqli($host,$user,$pass,$game_db);

        if(!$result = $most_recent_chats->query($query2)) {
            die();
        }

        while($row = $result->fetch_assoc()) {
            echo '<div class="chat-item" data-chat-id="' . $row['id'] . '">';
            echo '<p class="chat-message"><strong>' . $row['sender'] . ': </strong>' . $row['message'] . '</p>';
            echo '<p class="chat-time">' . $row['time'] . '</p></div>';
        }

        $result->free();
        $most_recent_chats->close();
} else {
    //Query 2 from above is repeated; basically, skips adding new message
    //and simply retrieves any other new messages
    $query2 = "SELECT * FROM `chat_global` WHERE id>'$most_recent_chat';";

    $most_recent_chats = new mysqli($host,$user,$pass,$game_db);

    if(!$result = $most_recent_chats->query($query2)) {
        die();
    }

    while($row = $result->fetch_assoc()) {
        echo '<div class="chat-item" data-chat-id="' . $row['id'] . '">';
        echo '<p class="chat-message"><strong>' . $row['sender'] . ': </strong>' . $row['message'] . '</p>';
        echo '<p class="chat-time">' . $row['time'] . '</p></div>';
    }

    $result->free();
    $most_recent_chats->close();
}

if(isset($new_chat)) ブロックはシンプルで、問題はありません。基本的に、新しいメッセージがある場合、新しいメッセージをチャット データベースに追加し、ブラウザの観点から見て最新の ID 番号よりも大きい ID 番号を持つすべてのメッセージを返します。この部分は機能し、その情報を 1/4 秒以内にブラウザに返します。

このコードのelseブロックは、私がいくつか問題を抱えているように見える場所です. else ブロックは、if ブロックの後半 ($query2 から下) と同じ行です。動作しますが、非常にゆっくりです。一方、if ブロックはサーバーから平均 1/4 秒でロードされますが、else ブロック (コードが少ない) はデータを返すのに平均 90 秒かかります。$.ajax 呼び出しは、ユーザーがメッセージを送信したかどうかに関係なく同じ関数です。唯一の違いは、ユーザーがメッセージを送信した場合に if ブロックが参照される (したがって $.ajax 呼び出しは手動である) ことですが、else ブロックはブラウザーで setTimeout(function,5000) 行を繰り返すことによって自動的に参照されます。

setTimeout() が適切に機能していることは 99.9% 確信しています。なぜなら、手動で $.ajax 呼び出しを設定して一般的な $new_chat (つまり、「これはメッセージです」) を送信すると、関数は毎回機能するからです。5 秒ごとにチャットが送信され、1/4 秒後にチャット ページに期待どおりに表示されます。(私のチャット ページは上記の PHP によって完全に読み込まれます。ユーザー A から送信されたメッセージでさえ、上記のファイルに送信され、処理され、ユーザー A に返送される必要があります。これにより、ユーザーは自分のメッセージが送信されたことを知ることができます。)

肝心なのは、なぜこの動作が発生しているのかについて、私は完全に途方に暮れているということです。$.ajax は、自動でも手動でも同じ関数にあります。PHP は同じコードで、遅いブロックも起動時間が短くなります! $.ajax 呼び出しは、手動の場合は完全に高速に実行され、メッセージが自動 $.ajax と一緒に送信された場合も完全に高速に実行されます。私は AJAX と jQuery を初めて使用するので、問題はこれらのテクノロジのいずれかにあると考えたいのですが、私が座っている場所からはまったく意味がありません。

4

0 に答える 0