如何每秒刷新我的聊天记录并调用PHP函数?

时间:2018-04-20 13:00:15

标签: php jquery ajax

尝试删除问题!

3 个答案:

答案 0 :(得分:0)

您可以使用object每秒刷新一次

答案 1 :(得分:0)

你的ajax调用结构不正确,应该是:

$.ajax({...}).done(function(feedback){
 $('div.chat_data').html(feedback);
 setTimeout(refreshChat, 1000);
});

这样,您首先填充聊天,然后再拨打一个电话,以便在另一个电话完成之前不会进行新的呼叫。

编辑:您应该使用.done而不是.complete,因为.complete已弃用jquery 3.0以解决您的ajax承诺。

答案 2 :(得分:0)

我强烈建议不要使用同步AJAX调用,而是在每个请求上设置短暂超时并使用setInterval()而不是setTimeout()。 AJAX的重点在于它应该是异步的。这样,您的脚本可以在等待响应从服务器返回时继续执行其他操作,而不是长时间无响应。

其次,你有点Schlemiel the Painter问题。每次请求(每秒)您都会通过互联网发送整个聊天记录,而聊天记录实际上通常不会发生变化。只发送聊天室中发布的任何新消息会更有效率。

尝试修改PHP脚本以将一些JSON数据作为对象发回。让我们开始简单,并创建一个这样的对象,假设$log包含最后几条聊天消息,$lastID保存最后一条消息的ID。您的SQL查询将类似于:

SELECT `name`, `message` FROM `chatApp` WHERE ID > ?

参数填充了javascript提交的最后一个ID。 (不要忘记使用存储的参数,因为不信任用户)。

不要忘记设置正确的邮件标题:

$response = new \stdClass();
$response->changes = $log;
$response->messageID = $lastID;
header("Content-Type: text/json");
echo json_encode($response);

尝试修改javascript程序以每秒调用这样的例程:

$.ajax({
    type: "POST",
    url: "index.php",
    data: {
        lastMessageID: lastID
    }
}).done(function( response ) {
    $('div.chat_data').append(response.changes);
    lastID = response.messageID;
}); 

现在我们尚未完全在那里。当请求花费的时间超过一秒时,您可以获得一些竞争条件。您应该做的是将每个聊天消息包装在其自己的元素中(例如,<div>似乎最合适),并将更改后的聊天消息作为数组发送回来。

使用PHP的关联数组,您可以使用数据库行的ID作为数组键,并将整个数组放入$log变量中。它在javascript端可读为response.changes[<N>],其中<N>是一些元素ID。迭代response.changes的成员,然后跳过已存在的任何消息。

为了将ID存储在DOM中,您可以使用以下内容:

<div class='chat_message' data-id=576><p>Hello World!</p></div>

表示聊天消息。然后,您可以quickly find发送与您的回复相符的任何邮件。您还可以使用jQuery的元素存储,或使用特定于chatapp对象的变量来缓存当前显示的消息ID。