Как следить за изменениями страницы без опроса? - PullRequest
1 голос
/ 26 мая 2011

В настоящее время у меня есть бот IRC, написанный на C ++, который отслеживает изменения на странице, написанной на php, а затем выводит эти изменения в канал IRC.Однако текущий метод довольно неэффективен, поскольку он просто постоянно опрашивает страницу раз в 10 секунд и сравнивает ее с последней увиденной версией, чтобы проверить, изменилось ли что-нибудь.Я могу уменьшить интервал проверки страницы примерно до 2-3 секунд, прежде чем бот IRC начнет снижать производительность, однако это не идеально.Часто страница, которую я отслеживаю, может меняться несколько раз в течение 10-секундного периода, поэтому изменение может быть пропущено, что может быть лучшим способом для получения данных со страницы?Учитывая, что я управляю как страницей, написанной на PHP, так и ботом IRC, но они находятся на разных серверах.

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

Ответы [ 5 ]

2 голосов
/ 26 мая 2011

Если данные, сгенерированные PHP, каким-то образом не выдвинули в поток (широковещание или канал), к сожалению, у вас нет другого выбора, кроме опроса страницы.

То, что вы могли бы сделать, это отправить данные из PHP с помощью широковещательной передачи, либо установить постоянное соединение бота с PHP-скриптом, либо заставить PHP самостоятельно вычислять различия.

1 голос
/ 26 мая 2011

Я бы предложил такой подход:

  1. когда вы получаете свою страницу, укажите очень большой тайм-аут, скажем, 10 минут (потерпите меня на секунду);

  2. если у вас есть новая страница, пусть сервер вернет ее; в противном случае просто не отправляйте ответ

  3. если страницы нет, клиент будет ждать до 10 минут, прежде чем сдаться (тайм-аут); но, если в это время появляется новая страница, ваш сервер может ответить на запрос и передать страницу клиенту;

  4. в случае истечения времени ожидания вы просто отправляете другой запрос с таким же длительным временем ожидания.

Надеюсь, я смог объяснить это ясно. Единственный сложный момент заключается в том, как ваша веб-страница (PHP) может удерживать ожидание при поступлении запроса, если нет новых данных для отправки обратно. Это можно легко сделать так:

if ($newDataAvailable) {
   file_put_contents($data, $request_uri);
   return;
}
while (!$newDataAvailable) {
   usleep(10000);
   $newDataAvailable = <check_for_data>;
}
//-- here data is available
<build response using get_file_contents($uri)>
<send response>
1 голос
/ 26 мая 2011

Хорошей альтернативой опросу является Comet. Вот примеры (хотя для JavaScript): http://www.zeitoun.net/articles/comet_and_php/start.

1 голос
/ 26 мая 2011

Если вам необходимо отслеживать каждое изменение, тогда ваша PHP-страница «передает» данные вашему боту, а не ваш IRC-бот «вытягивает» данные со страницы (посредством опроса). Это можно сделать через любой сетевой сокет, даже что-то вроде HTTP-запроса POST со страницы PHP к вашему боту через порт 80.

1 голос
/ 26 мая 2011

PHP-скрипт должен отправить сообщение на публичный порт или путь, по которому слушает ваш IRB-бот, содержащий информацию обо всех сделанных постах.Таким образом, вы будете уведомлены только тогда, когда придет сообщение.

Одно замечание о таких действиях, будьте осторожны, если в течение короткого периода времени будет много сообщений;если важен параллелизм, вы захотите реализовать его, используя соответствующий сервис MQ, например 0MQ / RabbitMQ / InsertMQFrameworkNameHere, чтобы обеспечить поступление сообщений в порядке и гарантированную отправку и получение.

...