2011-09-26 73 views
2

我正在使用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); 

在您看来,检查远程文件是否已更改的最佳方法是什么?我应该只使用时间戳检查吗?还是有其他一些聪明的选择,我不介意?!

+0

如果你有ftp访问,你可以找到实际的文件修改时间。 –

+0

为什么你要遵循重定向?比较文件大小也可以帮助您找出有关更改的信息。并且可能有ETAG标题值。 – hakre

+0

我遵循重定向,因为我最终期待图像文件,并且用户可能会提供缩短的链接。 OTOH,'ETAG'可能会提供,但并非总是如此。当然我也会检查文件大小。 – aL3xa

回答

3

您的方法对于查找Last-Modified时间值看起来不错。 (需要注意CURLINFO_FILETIME的-1返回,这意味着没有确定Last-Modified标头值。)

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

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

+0

感谢您指出-1意味着没有设置标题! –