【问题标题】:is this chat script efficient?这个聊天脚本有效吗?
【发布时间】:2010-08-16 03:33:28
【问题描述】:

我使用 php 和 ajax 进行了聊天,并且我正在使用 while 循环来检查数据库中的新消息。

这是检索消息的代码:

//retrive message

function update(){

$(document).ready(function(){

$.ajax({

async: true,

type: "POST",

url: "listen.php",

success: function(data){

$("#myp").before(data);

},

complete: function(){

window.setTimeout("update();",100);
}

});

});

};


//wating for new message

<?php
include_once("connect.php");

$type="";

while($type!=='n'){


usleep(1000);

$search=mysql_query("SELECT * from chat ORDER BY id DESC LIMIT 1");

$row=mysql_fetch_assoc($search);

$type=$row['type'];

$id=$row['id'];

}

echo $row['message'] . "<br/>";


mysql_query("UPDATE chat SET type='o' WHERE id=$id");


?>

现在这工作正常,php 文件不断检查是否有任何新消息,更新功能在页面加载时启动并等待响应。 但它有效吗?如果我要在网站上使用它,恐怕会因为 while 循环而对服务器造成太大压力。有谁知道一种方法,使while循环对服务器更友好?

【问题讨论】:

    标签: php ajax chat long-polling


    【解决方案1】:

    你的预感是正确的。典型的服务器设置每秒可以响应 100-1000 个 PHP 请求之间的任何地方,因此每个客户端每秒执行 10 个请求将消耗您服务器上的大量资源。虽然它可能会为少数人创建,但它不会很好地扩展。您的服务器最多可以容纳 10 到 100 个用户(这是相当低的)。

    一种解决方法是增加每次服务器轮询之间的时间,但这只是线性修复,会降低用户的体验。

    更好的解决方案可能是使用comet 方法。纯粹使用 PHP 很难(如果不是不可能的话),因此您需要处理一些外部 API 来处理长 http 请求。

    【讨论】:

    • 谢谢,但我不明白彗星到底是什么,我在哪里可以阅读更多关于它的信息?因为我不知道我在寻找什么,所以谷歌并没有真正的帮助。
    • @Petre Comet 是客户端连接到服务器并监听直到服务器准备好将数据推送到客户端。这允许一种模拟的“双向”通信。通常 HTTP 是一种方式(客户端 -> 服务器),但 Comet 允许服务器将事件推送到客户端。使用 PHP 很难做到这一点,因为每个连接都需要一个 PHP 进程(由于 ram 开销,这是非常有限的)。这就是为什么最好研究第三方彗星服务器的原因。他就是一个例子。 github.com/mcarter/hookbox/tree/master/examples/php_simple_chat
    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    相关资源
    最近更新 更多