【问题标题】:PHP - Download file and preserve timestamp?PHP - 下载文件并保留时间戳?
【发布时间】:2016-05-07 02:47:59
【问题描述】:

顾名思义,有没有一种快速下载文件的方法,但要带上时间戳?

我正在编写一个基本缓存,除其他检查外,它还确定(通过get_headers)给定的本地文件是否与其远程对应文件相同。

我知道我可以file_get_contents / file_put_contents 然后touch() 带有get_headers 结果的文件,但是调用正在进行另一个 HTTP 调用(即使它是 HEAD 调用),我' d 只喜欢测试 Last-Modified 作为最后的手段。

那么有没有一种快速的“一次 HTTP 调用”方式来下载文件并保留时间戳?一些远程文件位于 FTP 服务器上,但许多是文本文件,和/或位于 Web 服务器上。

编辑:有人提出了一个相关问题,但我的问题有所不同,因为我希望获得远程修改日期而无需拨打第二个电话,这是基于 copy() 的答案所暗示的

$http_response_header 似乎可以解决问题,如下所示。

【问题讨论】:

  • 正如您已经强调的那样,“下载”是一个相当笼统的术语。例如,Web 服务器可以选择发送或不发送Last-Modified,即使发送也没有任何保证(如果它是脚本而不是静态文件呢?)
  • @ÁlvaroGonzález 太对了。但是,因为我知道我正在使用的服务器总是返回 Last-Modified,所以我很乐意依赖它。我正在访问的文件是时间敏感的(Aurora Australis / Borealis 数据),因此这是他们发送 Last-Modified 标头的额外原因。

标签: php file-get-contents last-modified


【解决方案1】:
if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 60 * 5 ))) {
   // Cache file is less than five minutes old. 
   // Don't bother refreshing, just use the file as-is.
   $file = file_get_contents($cache_file);
} else {
   // Our cache is out-of-date, so load the data from our remote server,
   // and also save it over our cache for next time.
   $file = file_get_contents($url);
   file_put_contents($cache_file, $file, LOCK_EX);
}

【讨论】:

  • 执行onclick时可以写入文件
【解决方案2】:

您可以从$http_response_header 中获取缓存的Last-Modified 并使用它来触摸文件。

完全自动化它显然是不可能的,因为流不知道你要把它存储在哪里。

【讨论】:

  • 是的,这似乎可以解决问题!我已经修改了我的代码来检查这个变量,以及touch() 带有检索到的时间戳的文件。现在我的缓存按预期工作,如果远程和本地时间戳匹配,则会跳过重新下载。
【解决方案3】:

您可以使用 filemtime() 获取上次修改日期,然后使用 touch() 修改上次修改日期/时间

来源:PHP copy file without changing the last modified date

【讨论】:

  • 请注意,这取决于包装器,并非所有包装器都支持此功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
相关资源
最近更新 更多