3

我创建了一个类似这样的 ajax 聊天应用程序来每秒检查和获取消息。它工作正常。

  function get_messages(user_id) {
    $.ajax({
      type    : "POST",
      url     : "messages/get_messages", 
      cache   : false,
      data    : {
        user_id : user_id 
      },
      success : function(data) {
        if(data != '') {
          var obj = $.parseJSON(data);
          var messages = obj.messages;
        }
      }
    });
    setTimeout(function() { get_messages(user_id) }, 1000);
  }

我的问题是,当很多人使用此应用程序时,每秒向服务器发出大量 Ajax 请求时,这样做是否存在任何性能问题或服务器问题,. 这样做的最佳做法是什么?

谢谢你的宝贵建议:)

4

2 回答 2

2

进行此类聊天的最佳方法是将“聊天窗口”正确地称为<iframe>与脚本的永久连接,该脚本将继续运行并向客户端提供新消息,因此您不必使用 AJAX 压倒服务器要求。这可以通过调用 a ob_flush()(只是为了确保)并flush()在打印新内容后,使客户端立即接收更新来实现。但首先您必须通过一些设置来准备 PHP 以使其正常运行:

ini_set('zlib.output_compression', 'off');
ini_set('output_buffering', 'off');
set_time_limit(0);

如果您要使用会话,请不要忘记会话被锁定以防止并发写入,因此在收集到您需要的信息后,$_SESSION您必须通过使用释放会话,session_write_close()否则用户将无法发布消息等。

如果聊天窗口保持空闲超过几分钟,您的脚本还应该检查不活动并向客户端输出一些内容。它可以防止连接被浏览器终止。它不必是任何视觉上的东西,像评论一样的东西<!-- keep alive -->就可以了。

现在,你从哪里得到新消息?有几个选项可以做到这一点:

  1. 插座。您可以让这个聊天服务器应用程序在服务器端运行,所有聊天窗口 PHP 脚本都将连接到该服务器端,以获取新的聊天行。当用户提交一条新消息时,它会发送到聊天服务器并广播到聊天窗口脚本。这个聊天服务器也可以安全地用 PHP 编写!

  2. 一份文件。最简单的方法。每个聊天窗口 PHP 脚本都以只读方式打开同一个文件,并fseek()一直到其结束。循环检查它是否!feof()每秒几次以从中读取新行,如果有的话。当用户发送新消息时,您只需将此消息附加到文件中即可。

  3. SQL。不推荐,因为每个 Chat Window PHP 脚本都会打开到 RDBMS 的新连接并最终达到其限制,但您可以尝试不使用 RDBMS 的 SQLite。

于 2013-03-14T04:37:29.993 回答
1

不推荐使用常规的 Ajax/Php 来完成此任务。正如您所说,如果有很多用户怎么办,每个用户每秒都会查询数据库。

这会给您的服务器带来过多的负担,并且用户之间将无法进行实时通信。

我建议你使用 node.js 来完成这个任务。要使其跨浏览器兼容,您需要使用 node.js 框架,即 socket.io

所以最后的判断,使用node.js

你可以学习node.js http://www.nodebeginner.org/

网络上有非常好的教程。lynda.com 也有关于 node.js 的非常好的教程

于 2013-03-14T05:11:39.977 回答