5

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

谢谢

4

2 回答 2

4

检查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);
} 
于 2012-09-28T08:40:17.683 回答
1

尝试先发送 HEAD 请求以获取last-modified目标 url 的标头,以比较您的缓存版本。您也可以尝试在使用If-Modified-SinceGET 请求创建缓存版本时使用标头,以便对方也可以响应您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以相同的方式处理标题(从标题字符串中提取值,检查该值是否在未来)

于 2012-09-28T08:41:44.017 回答