连续ajax请求中的性能问题


Performance issue in continous ajax requests?

我创建了一个像这样的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请求服务器,这样做会有任何性能问题或服务器问题吗?做这件事的最佳实践是什么?

谢谢你的宝贵意见

进行此类聊天的最佳方法是将"聊天窗口"适当地称为具有与脚本的永久连接的<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. 套接字。您可以让这个聊天服务器应用程序在服务器端运行,所有的聊天窗口PHP脚本都将连接到这个服务器端,以获得新的聊天行。当用户提交一条新消息时,它被发送到聊天服务器,并广播到聊天窗口脚本。这个聊天服务器也可以安全地用PHP编写!

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

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

不建议使用常规Ajax/Php完成此任务。如您所述,如果有很多用户,每个用户每秒都会查询数据库。

这会给你的服务器带来太多的过载,用户之间将无法实时通信。

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

所以最后的结论,使用node.js

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

网上有很好的教程。Lynda.com也有很好的node.js教程