如何在没有轮询的情况下监控页面的更改?

时间:2011-05-26 16:17:39

标签: php c++ irc polling

我目前有一个用C ++编写的IRC bot,它监视用php编写的页面进行更改,然后将这些更改输出到IRC频道。 然而,当前的方法相当无效,因为它只是每10秒轮询页面一次,并将其与上次看到的版本进行比较,以检查是否有任何更改。 我可以在IRC机器人开始受到性能影响之前将页面检查间隔减少到大约2-3秒,但这并不理想。 我监控的页面通常会在10秒内更改多次,因此可能会错过更改,从页面获取数据的更好方法是什么?考虑到我控制用PHP编写的页面和IRC机器人,但它们在不同的服务器上。

此页面的唯一目的是将数据传递给IRC bot,因此如果这是一个更好的解决方案,它可以完全重新实现为其他东西; IRC bot还监控此页面的多个版本以检查不同的内容。

5 个答案:

答案 0 :(得分:2)

如果PHP生成的数据不是以某种方式推送在流(广播或提要)上,那么不幸的是,除了轮询页面之外别无其他选择。

你可以做的是使用广播从PHP推送数据,或者从僵尸程序到PHP脚本建立持久连接,或者让PHP自己计算差异。

答案 1 :(得分:1)

PHP脚本应该向您的IRB机器人监听的公共端口或路径发送消息,其中包含有关所发布的任何帖子的信息。这样,只有在消息到达时才会通知您。

关于做这些事情的一个注意事项,请注意短期内有很多帖子;如果并发很重要,你需要使用适当的MQ服务(如0MQ / RabbitMQ / InsertMQFrameworkNameHere)来实现它,以确保消息按顺序到达并保证发送和接收。

答案 2 :(得分:1)

如果您需要监控每个更改,那么让您的PHP页面“推送”数据到您的机器人,而不是您的IRC机器人从页面“拉”数据(通过轮询)。这可以通过任何网络套接字完成,甚至可以通过端口80从PHP页面到机器人的HTTP POST请求。

答案 3 :(得分:1)

投票的一个很好的选择是Comet。以下是示例(适用于JavaScript):http://www.zeitoun.net/articles/comet_and_php/start

答案 4 :(得分:1)

我会建议这种方法:

  1. 当你检索你的页面时,指定一个很长的超时,比如10分钟(暂时跟我一起);

  2. 如果你有一个新页面,让服务器返回它;否则只是不发送回复

  3. 如果没有页面,客户端将在放弃前等待最多10分钟(超时);但是,如果在此期间有新页面,您的服务器可以回复请求并将页面传递给客户端;

  4. 如果超时触发,您只需发送另一个具有相同长超时的请求。

  5. 希望我能清楚地解释清楚。唯一棘手的问题是,如果没有新数据要发回,您的网页(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>