2010-05-02 20 views
0

Le contenu actuel de this google docs page est:Comment puis-je forcer fopen() de PHP à retourner la version actuelle d'une page web?

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

Cependant, lors de la lecture cette page avec le PHP fopen() script suivant, je reçois un plus, en cache Version:

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

J'ai essayé deux solutions proposées dans this question (un attribut aléatoire et en utilisant POST) et j'ai également essayé clearstatcache() mais je reçois toujours la version mise en cache de la page Web.

Que dois-je modifier dans le script suivant afin que fopen() renvoie la version actuelle de la page Web?

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

?> 

AJOUTÉE: prendre les $ opte et contexte $ me donne une page en cache ainsi:

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

AJOUTÉE: ce boucle de script qui envoie un agent utilisateur Firefox renvoie la version en cache également:

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

Répondre

1

Je reçois aussi ceci:

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

Le « cache » doit être être fait à Google Docs ou, plus probablement, il est de votre faute (URL erronée?).


têtes de réponse:

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

oui, je parie que vous utilisez Internet Explorer lorsque vous obtenez la version en cache ai-je raison? Je reçois la version actuelle dans Firefox et Chrome mais la version CACHED dans IE8, comme indiqué ici: http://stackoverflow.com/questions/2742258/why-direfire-chrome-show-a-different-page-than- ie8, alors sûrement, puisque Firefox et Chrome (webkit?) peuvent en effet obtenir la version actuelle, il doit y avoir une option dans fopen() pour forcer aussi google docs à donner une version actuelle. –

+0

@Edward: Nope, en cours d'exécution Firefox 3.6.3 ici et je n'ai jamais visité cette URL avant avec un navigateur quelconque. Croyez-moi: ** c'est de votre faute **. –

+0

@Edward: Avez-vous besoin de frapper ** CTRL + F5 dans Firefox et Chrome ** ?! –

1

Essayez de faire que votre navigateur n'est pas mise en cache des informations. Je ne vois aucun en-tête de cache ou quoi que ce soit. Votre serveur Web peut ajouter quelque chose, ou votre navigateur peut supposer qu'il est mis en cache. Essayez d'inclure l'heure avec la sortie pour vous assurer que la demande a été générée au bon moment.

J'ai utilisé il y a des années pour des données qui se mettaient à jour assez souvent. Jamais rencontré un problème de cache avec fopen. En fait, je serais déçu si les développeurs PHP ajoutaient un cache web à ouvrir car cela ruinerait la plupart des cas d'utilisation valides ET cela n'est pas dans leur documentation. Je vais aller voir le code source PHP juste pour être sûr. Pouvez-vous mettre à jour le document afin que certains d'entre nous puissent essayer de le reproduire?

+1

merci, j'ai mis à jour le document, mais le script fopen() n'a rien à voir avec mon navigateur, je suis sûr que je pourrais trouver un réglage dans Internet Explorer pour effacer son cache afin qu'il affiche la version actuelle Firefox et Chrome font mais ce dont j'ai besoin pour travailler est le script, de toute évidence Google Docs fait une sorte de mise en cache sélective mais ce que je veux savoir, c'est pourquoi il donne une nouvelle version à mon navigateur Firefox. script ci-dessus qui a une ancienne version d'un agent utilisateur firefox, quels autres paramètres dans curl/fopen puis-je changer pour forcer une nouvelle version? –

+0

Voir mon autre réponse, mais fondamentalement c'était s'assurer que le problème n'était pas votre ordinateur en cache le script que vous avez fait (pas la page google docs) – Reece45

2

Je l'ai reproduit avec succès. La mise en cache de Google IS lorsque vous n'êtes pas le propriétaire du document Web publié. Si vous vous déconnectez, cela m'a donné l'ancienne version. Après que je l'ai publié et que je l'ai republié, je ne pouvais plus reproduire le problème. Assurez-vous de continuer à publier le document sous la section "Partager en tant que page Web" lorsque vous le mettez à jour.Pour être sûr, vérifiez dans un navigateur qui n'est pas connecté (ou votre script). S'il ne se met pas à jour: annuler la publication et publier à nouveau. Cela n'a pas changé l'URL pour moi.

+0

+1, Nice. Ses navigateurs Firefox et Chrome ont un ensemble de cookies. Il doit s'agir de quelque chose en rapport avec cela ou avec Google - ou dans ce cas les deux. –