2010-05-02 77 views
0

当前内容的this google docs page是:如何强制PHP的fopen()返回当前版本的网页?

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&amp;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; 
} 

?> 

新增:取出$选择采用$背景给了我一个缓存的页面,以及:

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; 
} 

新增:此卷曲脚本,它发送一个Firefox用户代理还返回缓存版本:

<?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); 
?> 

回答

1

我也得到这样的:

Test One;http://docs.google.com/View?id=dc7gj86r_30dzgzbjch 
Test Two;http://docs.google.com/View?id=dc7gj86r_31dbssfrzx 

的“缓存”必须在谷歌文档被正在做的,或者更可能的是,它是你的错(网址有误?)。


响应头:

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 
+0

是的,我敢打赌,当您获得缓存版本时,您正在使用Internet Explorer,对不对?我在Firefox和Chrome中获得CURRENT版本,但在IE8中获得CACHED版本,如下所示:http://stackoverflow.com/questions/2742258/why-do-firefox-chrome-show-a-different-page-than- ie8,肯定的,因为Firefox和Chrome(webkit?)确实可以获得当前版本,所以在fopen()中必须有一些选项来强制google文档提供当前版本。 – 2010-05-02 03:07:14

+0

@Edward:Nope,在这里运行Firefox 3.6.3,之前我从来没有用任何浏览器访问过这个URL。相信我:**这是你的错**。 – 2010-05-02 03:12:04

+0

@爱德华:你有没有在Firefox和Chrome中点击CTRL + F5 **? – 2010-05-02 03:17:50

1

尽量确保你的浏览器不缓存信息。我没有看到任何缓存标题或任何内容。您的网络服务器可能会添加一些内容,或者您​​的浏览器可能会假设它已被缓存。尝试在输出中包含时间,以确保请求是在正确的时间生成的。

我在很多年前用fopen来更新数据,经常更新。从来没有遇到与fopen缓存问题。事实上,如果PHP开发人员添加一个Web缓存来打开它,将会破坏大部分有效的用例,而且它不在它们的文档中,我会感到失望。我会去看看PHP源代码,以确保。

你可以更新文件,以便我们有些人可以尝试复制吗?

+1

谢谢,我再次更新了文档,但fopen()脚本与我的浏览器无关,我确定我可以在Internet Explorer中找到一些设置来清除其缓存,以便它显示当前版本为我的Firefox和Chrome可以做,但我需要的是脚本,显然谷歌文档正在做某种选择性缓存,但我想知道的是为什么它给了我的Firefox浏览器一个新版本,但我的(刚刚添加)卷曲脚本上面有一个Firefox版本的用户代理,还有哪些curl/fopen中的其他设置可以更改为强制新版本? – 2010-05-02 03:21:04

+0

看到我的其他答案,但基本上这是确保问题不是你的电脑缓存你制作的脚本(不是谷歌文档页面) – Reece45 2010-05-02 03:43:15

2

我已经成功地转载了此内容。如果您不是发布的网页文档的所有者,Google会进行缓存。如果你注销,它给了我旧版本。

在我取消发布并重新发布之后,我无法再重现此问题。确保您在更新文档时将文档保留在“以网页形式共享”下。

只要确认,检入未登录的浏览器(或脚本)即可。如果不更新:取消发布并再次发布。它没有改变我的网址。

+0

+1,Nice。他的Firefox和Chrome浏览器设置了Cookie。它必须是与Google相关的内容或与Google相关的内容,或者在这两种情况下。 – 2010-05-02 03:45:07