【问题标题】:file_get_contents no caching?file_get_contents 没有缓存?
【发布时间】:2014-02-13 12:58:37
【问题描述】:

我正在使用 file_get_contents() 从外部网站加载动态图像。

问题是图像已在远程网站上更新,但我的脚本仍在显示旧图像。我假设服务器将图像缓存在某处,但是当使用 file_get_contents 获取文件时,如何强制服务器清除缓存并使用更新的图像?

在我的本地机器上,我必须按 CTRL+F5 来强制刷新图像。

我也尝试在我的脚本中不添加缓存头,但没有成功:

    $image = imagecreatefromstring(file_get_contents($path));
    header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
header('Content-type: image/png');
imagepng($image);
exit();

【问题讨论】:

标签: php image caching file-get-contents


【解决方案1】:

您的问题是您正在使用 external 资源来加载文件。加载后 - 向 your 客户端发送一些标头是没有意义的。您的图片已经被加载(并且是从外部资源缓存的)。

不过,有一个简单的技巧可以解决问题。假设您在 $path 中使用类似 http://domain.com/path/to/image 的东西。然后就做:

$image = imagecreatefromstring(file_get_contents($path.'?'.mt_rand()));

-所以想法是向 GET-request 添加一些随机值并防止它被缓存。

【讨论】:

  • 问题是 - 并非所有路径 ? 都适用(显然,在某些情况下它可能会破坏有效的 URI)
  • 我以前从未经历过。有什么要分享的吗?
  • @ShankarDamodaran 假设您的图像路径是http://domain.com/image.php?id=xxx。添加另一个 ? 将破坏有效的 URI。因此,在常见情况下,与? 进行盲连接并不是一个好主意(至少需要澄清$path 格式)
  • 我总是发现使用time() 是更好的做法,因为它比mt_rand() 便宜。
  • time() 肯定会在几个传入请求适合它一秒钟时失败。
猜你喜欢
  • 2013-08-08
  • 2012-07-27
  • 2016-05-03
  • 2015-09-13
  • 2011-02-22
  • 2013-09-10
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
相关资源
最近更新 更多