如何在不轮询的情况下监视页面的更改?

问题描述

| 我目前有一个用C ++编写的IRC机器人,它监视用php编写的页面的更改,然后将这些更改输出到IRC通道。 但是,当前的方法效率不高,因为它仅每10秒不断轮询一次页面,并将其与上次查看的版本进行比较,以检查是否有任何更改。 我可以将页面检查间隔减少到IRC bot开始受到性能影响之前的2-3秒左右,但这并不理想。 通常,我正在监视的页面可以在10秒内多次更改,因此可能会丢失更改,那么从页面获取数据的更好方法是什么?考虑到我控制着用PHP编写的页面和IRC bot,但是它们位于不同的服务器上。 该页面的唯一目的是将数据传递给IRC机器人,因此,如果这是一个更好的解决方案,则可以将其完全重新实现。 IRC机器人还监视该页面的多个版本,以检查其他内容。     

解决方法

如果不幸的是,如果PHP生成的数据没有以某种方式推送到流(广播或提要)上,那么您除了轮询页面外别无选择。 您可以做的是使用广播从PHP推送数据,或者从Bot到PHP脚本建立持久连接,或者让PHP自己计算差异。     ,PHP脚本应将一条消息发送到您的IRB僵尸程序侦听的公共端口或路径,其中包含有关发布的任何信息。这样,仅在收到消息时通知您。 关于做这类事情的一个注意事项,要注意在短时间内是否有很多帖子;如果并发性很重要,则需要使用适当的MQ服务(例如0MQ / RabbitMQ / InsertMQFrameworkNameHe)来实现此目的,以确保消息按顺序到达并保证发送和接收。     ,如果您需要监视每个更改,那么将您的PHP页面“推”数据发送到您的机器人,而不是将IRC机器人“推”数据从页面(通过轮询)发送到您的机器人。这可以通过任何网络套接字来完成,甚至可以通过端口80从PHP页面到bot进行HTTP POST请求。     ,轮询是一种很好的替代方法。以下是示例(尽管适用于JavaScript):http://www.zeitoun.net/articles/comet_and_php/start。     ,我建议这种方法: 当您检索页面时,请指定很长的超时时间,例如10分钟(请耐心等待一会儿); 如果您有新页面,请让服务器返回它;否则就不要发送回复 如果没有页面,客户端将等待多达10分钟,然后再放弃(计时);但是,如果在此期间有一个新页面,则您的服务器可以回复该请求并将该页面传递给客户端; 万一发生超时,您只需发送另一个具有相同长超时的请求即可。 希望我能解释清楚。唯一棘手的问题是,如果没有新的数据要发送回去,则网页(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>
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...