Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 连续ajax请求中的性能问题?_Php_Ajax - Fatal编程技术网

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

Php 连续ajax请求中的性能问题?,php,ajax,Php,Ajax,我创建了一个类似这样的ajax聊天应用程序,用于每秒检查和获取消息。而且效果很好 function get_messages(user_id) { $.ajax({ type : "POST", url : "messages/get_messages", cache : false, data : { user_id : user_id }, success : fu

我创建了一个类似这样的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请求,这样做会不会有性能问题或服务器问题。这样做的最佳实践是什么


感谢您的宝贵建议:)

进行此类聊天的最佳方式是将“聊天窗口”恰当地称为
,并与脚本保持永久连接,该脚本将继续运行,并向客户端提供新消息,这样您就不必用AJAX请求淹没服务器。这可以通过在打印新内容后调用
ob\u flush()
(只是为了确保)和
flush()
来实现,从而使客户端立即接收更新。但首先,您必须通过进行一些设置来准备PHP以使其正常运行:

ini_set('zlib.output_compression', 'off');
ini_set('output_buffering', 'off');
set_time_limit(0);
如果要使用会话,请不要忘记会话已锁定以防止并发写入,因此在从
$\u SESSION
收集所需信息后,必须使用
SESSION\u write\u close()
释放会话,否则用户将无法发布消息等

如果聊天窗口空闲超过几分钟,脚本还应该检查是否处于非活动状态,并向客户端输出一些内容。它防止浏览器终止连接。它不必是任何可视的,像
这样的注释就可以了

现在,你从哪里得到新消息?有几个选项可供选择:

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

  • 档案。最简单的方法。每个聊天窗口PHP脚本都以只读方式打开相同的文件,并将
    fseek()
    结束。循环检查其
    !feof()
    每秒读取几次以从中读取新行(如果有)。当用户发送新消息时,您只需将此消息附加到文件中,技巧就完成了

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


  • 使用常规Ajax/Php执行此任务并不可取。正如您所说的,如果有很多用户,每个用户每秒都会查询数据库

    这会给服务器带来太多的负载,用户之间无法进行实时通信

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

    最后的结论是,使用node.js

    您可以学习node.js

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

    简短回答是的。当您每秒为每个用户创建一个HTTP请求时,会有一个很大的性能问题。如果可以的话,可以考虑使用套接字。在套接字上附上LeeIs,但是如果这是不可能的,请确保JSON订阅是由MyCHACHE或类似的方法创建的,它们都是HTML编写的,所以它们也是可缓存的。确定工作流程中“昂贵”的部分(数据库IO等)并尽量减少发送内容这不是一个简单的问题。这取决于连接的用户数量。如果有1个用户“连接”,每秒1个ajax调用不是问题,但是如果有1000个或更多用户“连接”到tchat,这可能是一个大问题。我也推荐socket。为此,你可以试试pusher.com