Это правильный метод для длинного опроса (программирование кометы)

Прежде всего, я хотел бы поблагодарить всех вас, великие люди, за то, что вы так помогаете новым программистам.

У меня вопрос по поводу длительного опроса. Я изучил несколько статей о технике длительного опроса программирования на кометах. Мне этот метод кажется очень сложным, потому что он также иногда требует установки некоторых скриптов на стороне сервера.

Теперь я нашел пример долгого опроса. Он отлично работает, но я не уверен, что это правильный метод. Пример сценария касается приложения, похожего на чат. Этот скрипт php работает следующим образом:

  1. Сценарий php постоянно проверяет файл data.txt, пока он не будет изменен.
  2. Как только data.txt изменяется, новый текст выводится на веб-страницу.

Вот скрипт php:

<?php
$filename  = dirname(__FILE__).'/data.txt';

// store new message in the file
$msg = isset($_GET['msg']) ? $_GET['msg'] : '';
if ($msg != '')
{
    file_put_contents($filename,$msg);
    die();
}

// infinite loop until the data file is not modified
$lastmodif    = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
$currentmodif = filemtime($filename);
while ($currentmodif <= $lastmodif) // check if the data file has been modified
{
    usleep(500000); // sleep 500ms to unload the CPU
    clearstatcache();
    $currentmodif = filemtime($filename);
}

// return a json array
$response = array();
$response['msg']       = file_get_contents($filename);
$response['timestamp'] = $currentmodif;
echo json_encode($response);
flush();
?>

Я не включаю код веб-страницы, чтобы не усложнять вопрос. На веб-странице есть только div, который показывает текст data.txt всякий раз, когда он изменяется.

Основные моменты моего вопроса:

  • Является ли этот метод цикла подходящим методом для длительного опроса сервера?
  • Также, когда сервер выполняет sleep();, что произойдет с другими одновременными запросами?
  • Есть ли какой-нибудь способ уменьшить нагрузку на сервер из-за непрерывного скрипта длительного опроса?
  • Если клиент, запускающий этот длинный запрос опроса, отключается, как мы можем узнать и соответствующим образом остановить сценарий для этого отключенного клиента?

Пожалуйста, помогите мне решить эту проблему ... Спасибо


person Naeem Ul Wahhab    schedule 15.06.2012    source источник


Ответы (2)


Да, это идея. Однако вы должны иметь в виду, что этот скрипт не закончится, и для каждого пользователя будет создан экземпляр PHP. Я использую логику longpoll на стороне сервера v8cgi. После того, как клиент запустил запрос XMLHttp (XHR), сервер начинает с интервалами проверку нового ввода. Я добавил сервер таймера, чтобы отправлять ответ каждые 5 минут, после чего клиент - если он не отключен - повторно отправляет XHR, и процедура повторяется.

Таким образом, каждый экземпляр механизма на стороне сервера работает не дольше 5 минут, потому что, если клиент отключен, ответ, который сервер отправляет через 5 минут, не сопровождается новым XHR.

Процесс выглядит так:

  • клиент отправляет XHR
  • сервер порождает периодические проверки на наличие обновлений
  • if some update has to be send: server sends response
    • client processes response and restarts XHR
    • сервер запускает процесс и периодически проверяет наличие обновлений
  • if 5 minutes passed without updates:
    • server sends response and exits spawned process
    • клиент обрабатывает (пустой) ответ и перезапускает XHR
    • сервер порождает новый процесс и начинает проверку
  • если необходимо отправить какое-то обновление: сервер отправляет ответ
  • [...]
  • если прошло 5 минут без обновлений:
  • [...]
  • пока клиент не будет отключен (= нет нового XHR после ответа сервера)
person KooiInc    schedule 15.06.2012
comment
Спасибо за ответ. Фактически задержка составляет 500 мс, т.е. 0,5 секунды. Обратите внимание, что как только браузер клиента откроет страницу, этот скрипт начнет выполнять процедуру проверки и обновления. Если есть, например, Одновременно открыто 1000 клиентских браузеров, сервер должен постоянно отправлять ответ всем из них. Как мы можем проверить php-скрипт, если какой-либо из клиентов отключен, и остановить скрипт для них, оставив скрипт открытым для всех других онлайн-клиентов. Пожалуйста, объясните - person Naeem Ul Wahhab; 16.06.2012
comment
Все еще жду вашего ответа (похоже, здесь мало кто знает о долгом опросе, поэтому другого ответа я не получаю). Пожалуйста, поделитесь со мной своей техникой лонгполла. Буду очень благодарен. Как мы можем проверить php-скрипт, если какой-либо из клиентов отключен, и остановить скрипт для них, оставив скрипт открытым для всех других онлайн-клиентов. Пожалуйста помоги! - person Naeem Ul Wahhab; 18.06.2012
comment
Я добавил некоторые пояснения к своему вопросу, пожалуйста, прочтите это - person Naeem Ul Wahhab; 18.06.2012
comment
Я действительно описал в своем ответе, как запретить серверу держать открытыми все экземпляры механизма сценариев. Пожалуйста, внимательно перечитайте ответ. Я постараюсь сделать это более явным. - person KooiInc; 18.06.2012

да, это простой и удобный способ сделать это, и это не правильный метод, но не лучшая идея. потому что он страдает и вызовет множество проблем по мере увеличения числа пользователей.

а для виртуального хостинга это не лучшая идея, этот метод будет работать нормально, только когда пользователей не очень много, и если у вас есть собственный сервер. Если вы будете использовать этот метод на сервере общего хостинга, вы можете столкнуться с максимальным использованием ресурсов сервера или проблемами с блокировкой сеанса, и служба http может быть недоступна в течение некоторого времени.

или вы можете использовать существующий api для приложений чата или иметь выделенный сервер, который может запускать сценарии, такие как node.js и аналогичные серверные модули

person Bhavesh G    schedule 18.06.2012
comment
Спасибо за ответ и подсказки. - person Naeem Ul Wahhab; 27.08.2016