简单的PHP长轮询聊天脚本,太简单了?

Pab*_*blo 8 php chat long-polling

我正在开发一个简单的聊天应用程序,每个房间可能有10到20个用户.

查询数据库以查找新消息的脚本对于它将获得的所有请求看起来过于简单.

下面是循环新消息的代码块,脚本的其余部分只是获取变量,构造查询和json响应对象:

$sleepTime = 1; //Seconds
$data = "";
$timeout = 0;

//Query database for data
while(!$data and $timeout < 10){
    $data = getQuery($sql);
    if(!$data){
        //No new messages on the chat
        flush();
        //Wait for new Messages
        sleep($sleepTime);          
        $timeout += 1;
    }else{
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的块将每秒查询数据库中的新消息,持续10秒,如果在10秒之后没有新消息,它将通知浏览器.浏览器等待5秒钟,然后发送另一个请求以获取新消息.

但是,如果脚本发现新消息,则一旦获得来自服务器的新消息的响应,浏览器将立即请求更多新消息.

这个过程一直持续......

那么我怎样才能进一步优化这个过程呢?这是不是很好?在我的本地服务器上工作正常,但我担心只有少数用户可能会使所有请求和循环的实时服务器(共享主机)过载.

这是现场演示,您可以使用firebug http://pixbush.com/chat/chat.php查看

The*_*ith 2

这对 AJAX 来说是令人尖叫的。

请参阅我今天关于如何将 JavaScript 响应发送到 PHP 的文章。您的脚本根本没有理由必须循环。


编辑:我对 AJAX 的看法不好。当我编写 IRC 聊天机器人PHP-Egg时,我遇到了这个问题 * 100。我解决它的方法(请注意,回到 PHP 4 天)是使用pcntl_fork() PHP 并让它在每次出现时简单地返回信息。好处是,与 sleep() 不同,它不会 100% 阻塞 CPU,并且比 10 秒或您对其施加的任意限制快得多。


我再次修改我的答案(抱歉!):

使用某种异步进程将文本转储到文件中。

那么你要做的就是

if (filemtime('chat.log') > time() - 5) { echo json_encode(file_get_contents('chat.log')); }

好处:SQL 使用有限;无需循环。

  • 我很确定 OP *正在*使用 AJAX 和 **长轮询**,正如问题所述。http://en.wikipedia.org/wiki/Comet_(programming)#Ajax_with_long_polling (3认同)