Как заставить PHP fopen () возвращать текущую версию веб-страницы? - PullRequest
0 голосов
/ 02 мая 2010

текущее содержание этой страницы документации Google :

альтернативный текст http://www.deviantsart.com/upload/i9k01q.png

Однако при чтении этой страницы со следующим PHP fopen () я получаю более старую, кэшированную версию:

альтернативный текст http://www.deviantsart.com/upload/1ccdgn7.png

Я попробовал два решения, предложенных в этом вопросе (случайный атрибут и использование 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;
}

?>

ДОБАВЛЕНО: удаление $ 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;
}

ДОБАВЛЕНО: этот curl скрипт, который отправляет пользовательский агент 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 ]

2 голосов
/ 02 мая 2010

Я успешно воспроизвел это. Google IS кеширует, когда вы не являетесь владельцем опубликованного веб-документа. Если вы выйдете из системы, он даст мне старую версию.

После того, как я опубликовал и переиздал, я больше не мог воспроизвести проблему. Убедитесь, что вы продолжаете публиковать документ в разделе «Поделиться как веб-страница» при его обновлении.

Просто чтобы убедиться, проверьте браузер, который не вошел в систему (или ваш скрипт). Если он не обновляется: отмените публикацию и снова опубликуйте. Это не изменило URL для меня.

1 голос
/ 02 мая 2010

Убедитесь, что ваш браузер не кэширует информацию. Я не вижу никаких заголовков кэша или чего-либо еще. Возможно, ваш веб-сервер что-то добавляет или ваш браузер предполагает, что он кэширован. Попробуйте включить время в вывод, чтобы убедиться, что запрос был сгенерирован в правильное время.

Я использовал fopen несколько лет назад для данных, которые обновлялись довольно часто. Никогда не сталкивался с проблемой кеша с fopen. На самом деле, я был бы разочарован, если бы разработчики PHP добавили веб-кеш в fopen, поскольку это разрушило бы большинство действительных вариантов использования, И это не в их документации Я пойду посмотрю исходный код PHP, чтобы убедиться.

Можете ли вы обновить документ, чтобы некоторые из нас могли попробовать его воспроизвести?

1 голос
/ 02 мая 2010

Я также получаю это:

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

"Кэширование" должно выполняться в Документах Google или, скорее, это ваша ошибка (неправильный 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
...