如何检查网站,其他网站上的图像文件是否已更改,然后将其存储为旧版本?
我正在使用它来记录服务器上的图像。
答案 0 :(得分:1)
这只是最简单方法的快速草图。如果您想了解更多细节,请在评论中提问。
下载图像,为其计算哈希并将图像存储在文件系统中,并将图像ID +哈希+文件系统路径(以及可能的其他信息,如请求时间)存储在数据库中。
< / LI>检查更新时,从数据库中获取相同ID的最后可用信息,如果哈希值不相同,则图像不会更新。如果您使用加密哈希(如MD5或SHA1)并更改哈希,则几乎可以肯定图像也已更改。
设置cronjob以定期运行脚本。
要下载图片,您可以使用$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
等)可以达到同样的目的。
请勿滥用远程服务器。请记住,它的所有者有保持其运行的费用,并且绝对不希望让它被脚本占用超过可忽略的时间,传输的数据不多。使您的轮询周期适应目标服务器类型和图像大小。使其适应估计的变化频率也不是一个坏主意。
在存储副本时,请务必征得形象权利人的同意。许可可能是一件混乱的事情。小心,否则你可能会遇到麻烦。
如果您计划以某种方式抓取图片,robots.txt标准可能是您感兴趣的。这个文件可以告诉你,你不受欢迎,你应该尊重它。
有些相关更多,更少相关。人们想要主要观看HTML页面。这还有其他细节,这也是我没有将这个问题标记为其中一个问题的原因。