0

我目前正在尝试为一群专门的人创建一个小型聊天网站。

除了我继续完全迷失其中的一个主要部分外,该网站的大部分内容都是完整的并且可以正常工作。

仅当 MySQL 中的一个数据库已更新时,我才需要从服务器发送数据。

首先,我不知道如何让 PHP 每秒或更少地递归地检查这个数据库。我曾尝试使用 AJAX,但注意到这太频繁地轮询服务器并使用太多带宽,我还尝试使用服务器发送事件但无济于事,因为它仅每 3 秒发送一次数据,这太慢了.

简而言之; 我需要一种推送服务,它每隔 1 秒或更短时间定期向客户端发送数据,并且仅在需要时才会这样做。

    while(1)    
{
    $result = mysqli_query($con,"SELECT Username, Message, DateT FROM Chat ORDER BY ID DESC LIMIT 30");

    $list = array();

echo "data: ";
    while($row = mysqli_fetch_array($result))
    {
    echo '<tr><td class="user">'.$row['Username'].'</td><td class="text">'.base64_decode($row['Message']).'</td><td class="time">'.$row['DateT'].' [GMT]</td></tr>';
    }
echo PHP_EOL.PHP_EOL;
flush();
ob_flush();
sleep(1);
}
4

2 回答 2

3

您正在寻找的东西称为长轮询,说实话,php 并不适合这个。您可以查看如何在 php 中实现长轮询以及其他一些谷歌搜索的问题。

另一种选择是使用HTML5 websockets来减少带宽。你也可以在这里阅读好的答案

有一个非常好的使用 node.js 的库,它被称为socket.io

于 2013-10-25T21:49:51.813 回答
2

服务器端事件非常适合推送服务。它们比 websockets 更简单,因为它们是只读的,它们也更容易在带有 javascript polyfil的旧浏览器上支持,而不必回退到像 flash 这样的插件。

一个非常简单的脚本如下所示:

header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

while (1) {
    if($updated = check_for_updates()){
         echo "id: " . $updated['id'] . PHP_EOL;
         echo "data: " . $updated['msg'] . PHP_EOL;
         echo PHP_EOL;
         ob_flush();
         flush(); 
    }
    sleep(1);
}

在客户端,您将拥有:

var source = new EventSource('stream.php');

source.addEventListener('message', function(e) {
   console.log(e.data);
}, false);
于 2013-10-25T22:09:01.670 回答