连续ajax请求中的性能问题?

时间:2013-03-14 03:56:58

标签: php ajax

我创建了一个像这样的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请求服务器使用这个应用程序时,这样做是否有任何性能问题或服务器问题,。这样做的最佳做法是什么?

感谢您提出宝贵意见:)

2 个答案:

答案 0 :(得分:2)

这样做聊天的最好方法就是让“聊天窗口”正确地说为<iframe>,并且与脚本保持连接,该脚本将继续运行并向客户端提供新消息,这样你就不会必须用AJAX请求压倒服务器。这可以通过在打印新内容后调用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. 套接字。您可以在服务器端运行此Chat Server应用程序,以便所有聊天窗口PHP脚本将连接到新的聊天行。当用户提交新消息时,将其发送到聊天服务器并将其广播到聊天窗口脚本。这个聊天服务器也可以安全地用PHP编写!

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

  3. SQL。不推荐使用,因为每个聊天窗口PHP脚本都会打开一个到RDBMS的新连接,最终会达到其极限,但您可以尝试不使用RDBMS的SQLite。

答案 1 :(得分:1)

使用常规Ajax / Php执行此任务不是首选。如你所说,如果有很多用户,每个用户每秒都会查询数据库。

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

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

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

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

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