我有一个脚本,每天获取网页内容,我希望只在内容改变时才获取它,这样脚本运行速度更快,使用的流量也更少。
我的想法是首先获取头部并比较内容长度,如果不同则获取整个文档,但这不太精确,因为网站可能有动态部分,导致内容长度每次都不同。
是否有其他方法,比如使用某种DNS或其他方式?
我的想法是首先获取头部并比较内容长度,如果不同则获取整个文档,但这不太精确,因为网站可能有动态部分,导致内容长度每次都不同。
是否有其他方法,比如使用某种DNS或其他方式?
我寻找答案超过两天,没有人能给我一个通用的答案。
因此,我实现了etag和if-modified-since标头(正如Matt Raines和sowa在这里发布的),还为降低流量使用了像gzip这样的压缩。
此外,还有请求头范围,因此我可以像有人告诉我那样仅抓取页面的一部分,但我认为它只用于文件而不是网页。
感谢大家花费时间。
以下是想要检查远程文件是否比本地文件更新,并在是的情况下更新本地文件的答案:
// $remotePath = 'http://blahblah.com/file.ext';
// $localPath = '/usr/whatever/app/file.ext';
$headers = get_headers( $remotePath , 1 );
$remote_mod_date = strtotime( $headers['Last-Modified'] );
$local_mod_date = filemtime( $localPath );
if ( $local_mod_date >= $remote_mod_date ) {
// Local version up to date
} else {
// Remote file is newer
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $remotePath);
// other options here, eg: curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
if (curl_errno($ch)) {
// handle error : curl_error($ch)
}
curl_close ($ch);
if ( $result ) {
// Update local file with remote file contents
file_put_contents( $localPath, $result );
}
}
curl_setopt($curl, CURL_HTTPHEADER, ["If-Modified-Since: 2016-04-30 21:00:00"]);
这个代码行是否有效?我在一个上个月修改过的资源上得到了304 Not Modified
的响应。