Toon posts:

[PHP] file_get_contents lijkt te cachen?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste,

In een while loop haal ik de inhoud van meerdere XML-feeds op door middel van file_get_contents(), om vervolgens met SimpleXMLElement() aan de gang te gaan. De locatie van de XML-feed is altijd hetzelfde, enkel het id-nummer aan het einde veranderd. Helaas heb ik zelf niet de mogelijkheid om de xml-feed aan te passen (om bijv. een no-cache header toe te voegen).

Dit alles gebeurt met ongeveer de volgende code (heb alles wat niet relevant is eruit gehaald):

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php 
$i = 0; 
while()
{ 
   $i++; 
   $string = file_get_contents("http://www.blaat.nl/feed/xml-file.aspx?id=".$i); 

   echo $string."<br><br>"; 
   unset($string); 
} 
?> 


Als ik met mijn browser http://../xml-file.aspx?id=1 , http://../xml-file.aspx?id=2 , http://../xml-file.aspx?id=3 open dan krijg ik keurig 3 verschillende xml bestanden te zien.

Maar in bovenstaand voorbeeld krijg ik 3x dezelfde string te zien. Iemand enig idee hoe dit komt?

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 22:29
file_get_contents() is geen browser en slaat dus niets op. Er zit geen cache in en geen handling voor cookies. Dus dat het in je browser wel werkt zegt niet zoveel

Wat zie je als zonder browser (bv met wget) die pagina opvraagt?

[ Voor 12% gewijzigd door Kalentum op 29-02-2008 16:47 ]


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Er zou nog een transparante cache tussen kunnen zitten. Niet in PHP, maar tussen hem en die site.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Misschien heb je in dit voorbeeld al het eea versimpeld, en zo de fout over het hoofd gezien. Wat gebeurt er met:
PHP:
1
2
3
4
$string1 = file_get_contents("http://www.blaat.nl/feed/xml-file.aspx?id=1"); 
$string2 = file_get_contents("http://www.blaat.nl/feed/xml-file.aspx?id=2"); 
$string3 = file_get_contents("http://www.blaat.nl/feed/xml-file.aspx?id=3");
echo $string1 . "\n\n" . $string2 . "\n\n" . $string3;
Een file_get_contents() doet afaik helemaal niet aan caching.

[ Voor 6% gewijzigd door mithras op 29-02-2008 16:56 ]


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Een url veranderen door een GET-parameter toe te voegen of te wijzigen geeft in principe een nieuwe url, en zal dus niet gecachet worden. Veel scripts voegen niet voor niets een timestamp toe aan de url.

Acties:
  • 0 Henk 'm!

  • AndriesLouw
  • Registratie: December 2005
  • Laatst online: 19-09 02:45
Ik vermoed dat je geen GET parameters mee kunt sturen met file_get_contents. Probeer anders eens een CURL functie, CURL kan precies als een browser fungeren.

Specificaties | AndriesLouw.nl


Acties:
  • 0 Henk 'm!

  • HarmenM
  • Registratie: Juni 2001
  • Niet online
Je kunt misschien in de url (en dus als GET-parameter) een random string toevoegen

PHP:
1
$string1 = file_get_contents("http://www.blaat.nl/feed/xml-file.aspx?id=1&rand="rand(0,10000) );


Misschien dat er aan de server-kant een soort van caching plaats vind, want met de php-functie file_get_contents zal er nooit gecached worden, bij mijn weten.

Acties:
  • 0 Henk 'm!

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Ik kan me herinneren dat ik met file_get_contents en een URL laatst iets heb gedaan met een context parameter. Als ik kijk naar de PHP manual voor file_get_contents, dan wordt ook inderdaad gesproken over stream_context_create.

Wellicht de moeite waard om eens naar te kijken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor jullie commentaar. Het blijft maar misgaan met file_get_contents, wellicht een php-bugje. Ik heb de volgende punten aangepast, waarna het wel (lijkt) te werken:
- timestamp meegeven aan de url, zodat dit een 'nieuwe' url wordt.
- na iedere file_get_contents het script een halve seconden laten slapen met usleep().
- de functie file_get_contents herschreven, zie onderstaande code.


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function file_get_contents2($filename) 
{ 
    $opts = array('http'=>array('method'=>"GET", 'header'=>"Content-Type: text/xml; charset=utf-8")); 
    $context = stream_context_create($opts); 
          
    if (false === $fh = fopen($filename, 'r', false, $context)) 
    { 
        trigger_error('file_get_contents() failed to open stream: No such file or directory', E_USER_WARNING); 
        return false; 
    } 
  
    clearstatcache(); 

    $data = ''; 
    while (!feof($fh)) 
    { 
        $data .= fread($fh, 8192); 
    } 
  
    fclose($fh); 
    return $data; 
}
Pagina: 1