Ophalen van RSS feeds - beetje hulp nodig!

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Peter Veltman

Peter Veltman

28/04/2011 10:18:17
Quote Anchor link
Ik zit met het volgende een beetje in de maag...

Ik haal op mijn website om het 4 uur rss feeds van andere websites op en sla de xml bestanden op op de server. Probleem is dat er altijd wel een dwarsliggende website tussen zit die er ontiegelijk lang over doet om de feedcontent te geven, waardoor het curl scriptje dat dit doet maar niet aan een einde komt.

Ik wilde hiervoor een zekerheidje (time-out van 3 sec?) inbouwen, maar ik heb geen idee hoe!

Ik heb CURLOPT_CONNECTTIMEOUT en CURLOPT_DNS_CACHE_TIMEOUT geprobeerd, geen van beide heeft gewerkt...

Iemand die me hier alsjeblieft verder mee kan helpen?

Quote:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php

$array
= array(
"http://www.nu.nl/feeds/rss/algemeen.rss",
"http://feeds.nos.nl/nosnieuwsalgemeen",
"http://www.voetbalzone.nl/rss/rss.xml"
}

include_once 'simple_html_dom.php';

for ($i = 0; $i < sizeof($array); $i++) {

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $array[$i]);  
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);  
$str = curl_exec($curl);  
curl_close($curl);
 
$html= str_get_html($str);
$xmlcacheurl = $i.".xml";

if (is_writable($xmlcacheurl)) {
    if ($file = fopen($xmlcacheurl,"w")){
        if (fwrite($file,$html)){
                    echo "Feed cachen gelukt!";
        }

                fclose($file);
    }
}

}


?>
 
PHP hulp

PHP hulp

22/12/2024 09:44:43
 
Ben Elsinga

Ben Elsinga

28/04/2011 10:44:22
Quote Anchor link
Heb dat zelf opgelost door sleep() te gebruiken. Vraag me echter wel af op dat de juiste oplossing is.
Gewijzigd op 28/04/2011 10:45:05 door Ben Elsinga
 
Peter Veltman

Peter Veltman

28/04/2011 10:48:05
Quote Anchor link
Ben Elsinga op 28/04/2011 10:44:22:
Heb dat zelf opgelost door sleep() te gebruiken. Vraag me echter wel af op dat de juiste oplossing is.


Nee joh, sleep stelt het script alleen maar uit waardoor alles nog langer duurt, dat wil ik juist voorkomen! ;-) Ik wil dat het script zo snel mogelijk langs alle links gaat, en als er toevallig een link is die er te lang over doet om de feedcontent af te geven, dat wordt ie overgeslagen en wordt de rest van de array afgewerkt...
 
Jelmer -

Jelmer -

28/04/2011 10:55:59
Quote Anchor link
Heb je CURLOPT_TIMEOUT optie ook geprobeerd? Die zou dit wel moeten opvangen.

Edit: als je meerdere feeds hebt kan je curl_multi_init gebruiken om meerdere requests tegelijkertijd te doen. Als één site dan traag reageert, blokkeert dat de andere sites niet.
Gewijzigd op 28/04/2011 10:59:20 door Jelmer -
 
Peter Veltman

Peter Veltman

28/04/2011 11:19:01
Quote Anchor link
Bedankt Jelmer, ik heb CURLOP_TIMEOUT er tussen gegooid... maar weet nochtans niet of het werkt, het is altijd beetje lastig om dit soort zaken te testen omdat er niet altijd een link is die moeilijk doet.

Ik heb even naar curl_multi_init gekeken, ook naar voorbeelden, maar snap niet helemaal hoe dat mijn probleem moet verhelpen...
 
Jelmer -

Jelmer -

28/04/2011 12:11:24
Quote Anchor link
Zet tussen de feeds een link naar een eigen PHP-script dat sleep(30) doet, dat zou je timeout wel moeten triggeren.
 
Peter Veltman

Peter Veltman

28/04/2011 13:10:46
Quote Anchor link
Thanks Jelmer! Je tips hebben me goed op weg geholpen :-D

Nog één laatste vraagje, hoe kan ik een if-else gebruiken in combinatie met CURLOP_TIMEOUT ?

Dus indien er een timeout plaatsvindt, dan moet het script wat anders gaan doen dan wat ie momenteel doet.

Momenteel wordt er namelijk een leeg bestand geschreven naar een xml file omdat er dus een timeout heeft plaatsgevonden, heb liever dat er uberhaupt niets wordt geschreven en gewoon de eerdere gecachede versie wordt gebruikt...

Toevoeging op 28/04/2011 14:38:24:

Ik bedacht me, dat ik wellicht curl_errno functie moet gebruiken, zie deze link: http://php.net/manual/en/function.curl-errno.php

Het punt is echter, in het voorbeeld aldaar passen ze curl_errno toe op:

$ch = curl_init('http://404.php.net/');

Het probleem is echter dat het bovenstaande in mijn script de volgende vorm heeft:

$curl = curl_init();

als ik curl_errno toepas op $curl, dan geeft dat foutmeldingen...

Toevoeging op 28/04/2011 18:15:53:

Iemand die me nog een beetje kan helpen met het bovenstaande?

Ik wil dus een zekerheidje inbouwen, als er een timeout heeft plaatsgevonden, hoeft er dus ook niets gecacheded te worden...
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.