CURL只有在被修改后才能获取文件

时间:2012-09-28 08:30:18

标签: php curl file-get-contents

如何在使用CURL打开流之前了解文件是否已被修改 (然后我可以用file-get-contents打开它)

感谢

2 个答案:

答案 0 :(得分:3)

检查CURLINFO_FILETIME

$ch = curl_init('http://www.mysite.com/index.php');
curl_setopt($ch, CURLOPT_FILETIME, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
$exec = curl_exec($ch);

$fileTime = curl_getinfo($ch, CURLINFO_FILETIME);
if ($fileTime > -1) {
    echo date("Y-m-d H:i", $fileTime);
} 

答案 1 :(得分:1)

首先尝试发送HEAD请求以获取目标网址的last-modified标头,以便比较缓存版本。此外,您可以尝试使用If-Modified-Since标头,以及使用GET请求创建缓存版本的时间,以便另一方也可以使用302 Not Modified回复您。

使用curl发送HEAD请求看起来像这样:

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1);
$content = curl_exec($curl);
curl_close($curl)

$content现在将包含返回的HTTP标头,作为一个长字符串,您可以在其中查找last-modified:

if (preg_match('/last-modified:\s?(?<date>.+)\n/i', $content, $m)) {
    // the last-modified header is found
    if (filemtime('your-cached-version') >= strtotime($m['date'])) {
        // your cached version is newer or same age than the remote content, no re-fetch required
    }
}

您应该以相同的方式处理expires标题(从标题字符串中提取值,检查该值是否在将来)