【问题标题】:Check if remote file has changed检查远程文件是否已更改
【发布时间】:2011-09-26 22:29:08
【问题描述】:

我正在使用 PHP cURL 模块通过 HTTP 标头提取远程文件的时间戳。我已经设法通过使用CURLOPT_FILETIME 常量来获取修改时间戳。当然,我这样做也是为了查看远程文件是否已更改而无需下载其内容。

$ch = curl_init($url);  /* create URL handler */
curl_setopt($ch, CURLOPT_NOBODY, TRUE); /* don't retrieve body contents */
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); /* follow redirects */
curl_setopt($ch, CURLOPT_HEADER, FALSE); /* retrieve last modification time */
curl_setopt($ch, CURLOPT_FILETIME, TRUE); /* get timestamp */
$res = curl_exec($ch);
$timestamp = curl_getinfo($ch, CURLINFO_FILETIME);
curl_close($ch);

在您看来,检查远程文件是否已更改的最佳方法是什么?我应该只进行时间戳检查吗?或者还有其他一些我没有想到的聪明的选择?!

【问题讨论】:

  • 如果你有ftp访问权限,你可以找出实际的文件修改时间。
  • 你为什么关注重定向?比较文件大小也有助于了解更改。并且可能存在 ETAG 标头值。
  • 我遵循重定向,因为我希望最终得到一个图像文件,并且用户可能会提供一个缩短的链接。 OTOH,ETAG 可能会提供,但并非总是如此。当然,我也会检查文件大小。

标签: php file curl timestamp


【解决方案1】:

您的方法看起来很适合查找 Last-Modified 时间值。 (需要注意 CURLINFO_FILETIME 的 -1 返回,这意味着没有识别出 Last-Modified 标头值。)

您可以保存返回的时间,并在以后检查它是否已更改。如果更改了,请通过 Curl 获取新文件。

另一种选择是保存 ETag 和 Last-Modified 标头,然后使用条件请求再次获取图像。这会更复杂,但您每次都会保存额外的 HEAD 请求。您可以在这个 SO 问题中看到一些详细信息:if-modified-since vs if-none-match

【讨论】:

  • 感谢您指出 -1 表示没有设置标题!
猜你喜欢
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 2012-12-26
相关资源
最近更新 更多