2

我正在为 joomla(apache 服务器)编写一个聊天应用程序,并使用这种结构来模拟长轮询(服务器端):

function get_messages($last_id) {
   $time = time();
   while((time() - $time) < 25) {       
      $sql = 'SELECT * FROM #__messages WHERE `id` >'.intval($last_id);
      $db->setQuery($sql);
      $rows = $db->loadAssocList();
      if (count($rows)>0) { 
         echo 'JSON STRING HERE';  
      } else {
     flush();
  } 
   usleep(5000000);       
   }
}

如何优化这部分代码。我应该使用无限循环还是应该在构造时避免?P/S:我知道 Apache 不是编写聊天应用程序的最佳选择,而 node.js 更好。

谢谢!

4

2 回答 2

-1

无限循环从来都不是一个好主意,因为它们会破坏您的服务器资源。你最好让 JS 为你的 get_messages 函数提供间歇性轮询。使用超时并将脚本嵌入到显示消息的任何页面上。

于 2012-01-17T20:27:15.537 回答
-1

我将根据有限的信息来回答,我必须按照行业标准以最广泛的方式帮助您。你不需要以你现在的方式编码,因为它效率很低,而且坦率地说很危险。

这是运行间隔轮询所需的 mootools 代码(我使用了 Mootools,因为你说你正在使用 Joomla,我假设你使用的是 1.6+,因为本月 1.5 是 EOL):

//this sets how often you want to update (in milliseconds).
setInterval('chatPoll()',2000);
//this function essentially just grabs the raw data
//from the specified url and dumps it into the specified div
function chatPoll()
{
   var unixTimestamp Math.round(new Date().getTime() / 1000)
   var req = new Request({
      method: 'get',
      url: $('ajax-alert').get('http://www.yoururltoupdate.com/file.php?last=' + (unixTimestamp-2),
      data: { 'do' : '1' },
      onComplete: function(response) { response.inject($('my-chat-wrapper')); }
   }).send();
}

您的 PHP 文件应如下所示:

get_messages($_GET['last']);
function get_messages($last_id) {

      $sql = 'SELECT * FROM #__messages WHERE `id` >'.intval($last_id);
      $db->setQuery($sql);
      $rows = $db->loadAssocList();
      if (count($rows)>0) { 
         echo json_encode($rows);
      }     
}

我还没有完全测试过这段代码,但它应该可以工作,如果不能,肯定会帮助回答你关于如何实现你想要做的事情而不是你最初发布的方式的问题。如果你真的想变得花哨,你也可以查看 node.js。Joomla 也有大量的扩展,它们可以作为聊天媒介来提供支持,如果这就是你所追求的。

于 2012-01-22T20:30:05.823 回答