Запрос к серверу Apache в приложении чата - PullRequest
2 голосов
/ 13 января 2012

Я пишу приложение чата для 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 - лучше.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 января 2012

Я собираюсь ответить, основываясь на ограниченной информации, которая у меня есть, чтобы помочь вам как можно шире, следуя отраслевым стандартам.Вам не нужно кодировать так, как вы это делаете в настоящее время, потому что это очень неэффективно и откровенно опасно.

Вот код 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);
      }     
}

IЯ еще не полностью протестировал этот код, но он должен работать и, если нет, определенно поможет ответить на ваш вопрос о том, как следует достичь того, что вы пытаетесь сделать, а не так, как вы изначально разместили.Если вы действительно хотите стать модным, вы также можете проверить node.js.Также есть множество расширений для Joomla, которые работают в качестве среды чата в целях поддержки, если вы этого хотели.

0 голосов
/ 18 января 2012

Бесконечные циклы никогда не являются хорошей идеей, потому что они забивают ресурсы вашего сервера. Вам лучше иметь JS, обеспечивающий прерывистый опрос вашей функции get_messages. Используйте тайм-аут и вставьте скрипт на любую страницу, которая показывает сообщения.

...