如果它改变了,如何礼貌地询问远程网页?

时间:2014-02-18 19:25:16

标签: php http http-headers

远程网页已更新 - 有时速度较慢,一次只需十分钟左右。有时更频繁,如每分钟或更频繁。我想要存储的页面上有一段数据,每当它发生变化时都会更新它(不一定抓住每次更改但不会落后于“当前”,并保持更新运行24 / 7)。

每分钟下载整个远程页面,检查它是否与以前版本不同,绝对是粗暴的。

每分钟为远程网站ping一次标题不会太过分。

如果有任何提示何时重新检查更新,或者服务器仅在内容更改后回复内容,那将是理想的。

如何在保持最新状态的同时尽量减少对远程服务器的不必要流量?

“观察者/更新者”是用PHP编写的,使用simplexml_load_file()获取页面现在每分钟抓取一个远程URL,这样就可以很好地解决这个问题(例如,在确定文件不同只是重新连接实际内容半秒后,只是继续内容请求)可能是首选。

编辑:每个请求,示例标题。

    > HEAD xxxxxxxxxxxxxxxxxxxxxxxxxxx HTTP/1.1
    > User-Agent: curl/7.27.0
    > Host: xxxxxxxxxxxxxx
    > Accept: */*
    > 
    * additional stuff not fine transfer.c:1037: 0 0
    * HTTP 1/.1 or later with persistent connection, pipelining supported
    < HTTP/1.1 200 OK
    < Server: nginx
    < Date: Tue, 18 Feb 2014 19:35:04 GMT
    < Content-Type: application/rss+xml; charset=utf-8
    < Content-Length: 9865
    < Connection: keep-alive
    < Status: 200 OK
    < X-Frame-Options: SAMEORIGIN
    < X-XSS-Protection: 1; mode=block
    < X-Content-Type-Options: nosniff
    < X-UA-Compatible: chrome=1
    < ETag: "66509a4967de2c5984aa3475188012df"
    < Cache-Control: max-age=0, private, must-revalidate
    < X-Request-Id: 351a829a-641b-4e9e-a7ed-80ea32dcb071
    < X-Runtime: 0.068888
    < X-Powered-By: Phusion Passenger
    < X-Frame-Options: SAMEORIGIN
    < Accept-Ranges: bytes
    < X-Varnish: 688811779
    < Age: 0
    < Via: 1.1 varnish
    < X-Cache: MISS

2 个答案:

答案 0 :(得分:2)

使用HEAD发送HTTP cURL请求并检索Last-Modified值。这与GET类似,但HEAD仅传输状态行和标题部分,因此如果您发送HEAD请求,则不会对其他服务器“粗鲁”。

在命令行中,我们可以使用以下命令实现此目的:

curl -s -v -X HEAD http://example.com/file.html 2>&1 | grep '^< Last-Modified:'

使用PHP的cURL库重写它应该不会太难。

答案 1 :(得分:2)

ETag: "66509a4967de2c5984aa3475188012df"

这是一个非常有前途的标题。如果它确实对应于页面本身的更改,则可以查询服务器设置此请求标头:

If-None-Match: "<the last received etag value>"

如果内容未被修改,服务器应以304 Not Modified状态响应并且没有正文。见http://en.wikipedia.org/wiki/HTTP_ETag。它似乎也在运行缓存前端,所以无论如何你可能都没有太过努力。