【问题标题】:How to politely ask remote webpage if it changed?如果它改变了如何礼貌地询问远程网页?
【发布时间】:2014-02-18 19:25:15
【问题描述】:

远程网页更新 - 有时较慢,十分钟左右一次。有时更频繁,比如每分钟或更频繁。我想存储该页面上的一段数据,并在它发生变化时对其进行更新(不一定要获取 每个 更改,但不要落后于“当前”太远,并保持更新运行 24 /7)。

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

每分钟 ping 一次远程网站的标头不会太多。

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

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

“watcher/updater”是用 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

【问题讨论】:

  • 使用 HTTP HEAD 请求并检查 Last-Modified 标头...
  • 如果远程站点提供了一个“过期”标头,该标头可能会告诉您该站点何时需要刷新数据。
  • 取决于远程服务器设置和理解的缓存头。你能显示返回的标头的转储吗?

标签: php http http-headers


【解决方案1】:
ETag: "66509a4967de2c5984aa3475188012df"

这是一个很有前途的标题。如果确实对应页面本身的变化,可以查询设置这个请求头的服务器:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-08
      • 2010-09-10
      • 2019-08-12
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2022-12-12
      • 1970-01-01
      相关资源
      最近更新 更多