代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

如何强制php的fopen()返回网页的当前版本?

  •  0
  • Edward Tanguay  · 技术社区  · 15 年前

    这个 现在的 内容 this google docs page 是:

    alt text http://www.deviantsart.com/upload/i9k01q.png

    但是,当使用以下php阅读此页时 打开() 脚本,我得到一个 旧的,缓存的 版本:

    alt text http://www.deviantsart.com/upload/1ccdgn7.png

    我试过两个建议 this question (一个随机属性,使用post)我也尝试了 清除状态缓存() 但我总是得到网页的缓存版本。

    为了让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);
    ?>
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   Alix Axel    15 年前

    我也明白了:

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

    “缓存”必须在google docs上完成,或者更可能是你的错(错误的url?).


    响应头:

    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
  •  2
  •   Reece45    15 年前

    我已经成功地复制了这个。当您不是已发布web文档的所有者时,google正在缓存。如果你退出,它给了我旧版本。

    在我取消发布并重新发布之后,我再也不能复制这个问题了。更新文档时,请确保在“作为网页共享”下继续发布该文档。

    为了确定,请签入一个未登录的浏览器(或您的脚本)。如果不更新:取消发布并再次发布。它没有为我更改url。

        3
  •  1
  •   Reece45    15 年前

    请确保浏览器没有缓存信息。我没有看到任何缓存头或任何东西。您的Web服务器可能正在添加某些内容,或者您的浏览器可能假定它已缓存。请尝试在输出中包含时间,以便确保请求是在正确的时间生成的。

    几年前,我用fopen处理经常更新的数据。从未遇到过fopen的缓存问题。事实上,如果php开发人员在fopen中添加了web缓存,我会很失望,因为它会破坏大多数有效的用例,而且不在他们的文档中。我会去看看php源代码,以确保。

    你能更新一下文件以便我们中的一些人可以复制吗?