this google docs page的当前内容为:
alt text http://www.deviantsart.com/upload/i9k01q.png
但是,当使用以下PHP fopen()脚本阅读此页面时,我会获得较旧的,缓存的版本:
alt text http://www.deviantsart.com/upload/1ccdgn7.png
我尝试了this question中提出的两个解决方案(一个随机属性并使用POST),我也尝试了 clearstatcache(),但我总是得到网页的缓存版本。
我需要在以下脚本中更改哪些内容,以便fopen()返回当前版本的网页?
<?php
$url = 'http://docs.google.com/View?id=dc7gj86r_32g68627ff&rand=' . getRandomDigits(10);
echo $url . '<hr/>';
echo loadFile($url);
function loadFile($sFilename) {
clearstatcache();
if (floatval(phpversion()) >= 4.3) {
$sData = file_get_contents($sFilename);
} else {
if (!file_exists($sFilename)) return -3;
$opts = array('http' =>
array(
'method' => 'POST',
'content'=>''
)
);
$context = stream_context_create($opts);
$rHandle = fopen($sFilename, 'r', $context);
if (!$rHandle) return -2;
$sData = '';
while(!feof($rHandle))
$sData .= fread($rHandle, filesize($sFilename));
fclose($rHandle);
}
return $sData;
}
function getRandomDigits($numberOfDigits) {
$r = "";
for($i=1; $i<=$numberOfDigits; $i++) {
$nr=rand(0,9);
$r .= $nr;
}
return $r;
}
?>
ADDED:取出 $ opts 和 $ context 也为我提供了一个缓存页面:
function loadFile($sFilename) {
if (floatval(phpversion()) >= 4.3) {
$sData = file_get_contents($sFilename);
} else {
if (!file_exists($sFilename)) return -3;
$rHandle = fopen($sFilename, 'r');
if (!$rHandle) return -2;
$sData = '';
while(!feof($rHandle))
$sData .= fread($rHandle, filesize($sFilename));
fclose($rHandle);
}
return $sData;
}
ADDED:发送Firefox用户代理的 curl 脚本也会返回缓存版本:
<?php
$url = 'http://docs.google.com/View?id=dc7gj86r_32g68627ff';
//$user_agent = 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)';
$user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)';
$ch = curl_init();
//curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookie");
//curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookie");
curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
echo curl_exec($ch);
?>
答案 0 :(得分:2)
我已成功转载此内容。当您不是已发布的Web文档的所有者时,Google IS会进行缓存。如果您退出,它会给我旧版本。
在我取消发布并重新发布之后,我再也无法重现这个问题了。确保在更新时以“共享为网页”的形式继续发布文档。
只是为了确保,请检入未登录的浏览器(或您的脚本)。如果没有更新:取消发布并再次发布。它没有改变我的URL。
答案 1 :(得分:1)
我也明白了:
Test One;http://docs.google.com/View?id=dc7gj86r_30dzgzbjch
Test Two;http://docs.google.com/View?id=dc7gj86r_31dbssfrzx
“缓存”必须在Google文档中完成,或者更可能是,这是您的错(错误的网址?)。
回复标题:
Set-Cookie: ******
Content-Type: text/html; charset=UTF-8
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Date: Sun, 02 May 2010 03:30:29 GMT
X-Frame-Options: ALLOWALL
Content-Encoding: gzip
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Length: 3987
Server: GSE
答案 2 :(得分:1)
尝试确保您的浏览器没有缓存信息。我没有看到任何缓存标头或任何东西。您的网络服务器可能正在添加内容,或者您的浏览器可能会假设它已缓存。尝试在输出中包含时间,以便确保在正确的时间生成请求。
我在几年前使用fopen来获取经常更新的数据。永远不会遇到fopen的缓存问题。事实上,如果PHP开发人员为fopen添加了一个Web缓存,我会感到很失望,因为它会破坏大多数有效的用例并且它不在他们的文档中。我将去看看PHP源代码,以确保。
您可以更新文档,以便我们中的某些人可以尝试复制吗?