如何检查网站上的图像更新?

时间:2014-02-03 17:44:25

标签: image logging web

如何检查网站,其他网站上的图像文件是否已更改,然后将其存储为旧版本?

我正在使用它来记录服务器上的图像。

1 个答案:

答案 0 :(得分:1)

这只是最简单方法的快速草图。如果您想了解更多细节,请在评论中提问。

解决方案草图

  1. 下载图像,为其计算哈希并将图像存储在文件系统中,并将图像ID +哈希+文件系统路径(以及可能的其他信息,如请求时间)存储在数据库中。

    < / LI>
  2. 检查更新时,从数据库中获取相同ID的最后可用信息,如果哈希值不相同,则图像不会更新。如果您使用加密哈希(如MD5或SHA1)并更改哈希,则几乎可以肯定图像也已更改。

  3. 设置cronjob以定期运行脚本。

  4. 要下载图片,您可以使用$img = file_get_contents($url);。 MD5可以通过$hash = md5($img);计算,SHA1通过$hash = sha1($img);计算。用于存储使用file_put_contents($path, $img);

    优化

    有几种方法可以优化这项工作。

    要减少内存消耗,请使用file_put_contents($path, $url);将文件直接下载到文件系统,然后才能使用$hash = md5_file($path);$sha1_file($path);计算哈希值。这对于较大的图像更好。不好的是你必须再次从文件系统中读取数据来计算哈希值,所以我认为它会更慢。

    旁注:在您知道它确实使代码更好之前,切勿优化任何内容。始终在之前,之后和之后进行测量。

    如果服务器发送可靠的缓存标头,则可以进行另一项优化以保存来自远程服务器的数据传输。 ETag是最好的,因为它应该基于文件的内容。如果它没有改变,文件应该是相同的。如果您只想检查标题,请使用$headers = get_headers($url, 1);。要真正获取标题,您应该通过HEAD方法而不是GET发出HTTP请求。查看get_headers()手册以获取更多信息。要在获取回复正文时检查标题,请使用file_get_contents()$http_response_header特殊变量。

    发出表示您在上次访问时缓存图像的请求(通过If-Modified-Since等)可以达到同样的目的。

    礼仪和法律方面

    我告诉过你怎么样。现在我会告诉你什么时候(不是)。

    请勿滥用远程服务器。请记住,它的所有者有保持其运行的费用,并且绝对不希望让它被脚本占用超过可忽略的时间,传输的数据不多。使您的轮询周期适应目标服务器类型和图像大小。使其适应估计的变化频率也不是一个坏主意。

    在存储副本时,请务必征得形象权利人的同意。许可可能是一件混乱的事情。小心,否则你可能会遇到麻烦。

    如果您计划以某种方式抓取图片,标准可能是您感兴趣的。这个文件可以告诉你,你不受欢迎,你应该尊重它。

    相关问题

    有些相关更多,更少相关。人们想要主要观看HTML页面。这还有其他细节,这也是我没有将这个问题标记为其中一个问题的原因。