Ophalen van RSS feeds - beetje hulp nodig!
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)
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
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);
}
}
}
?>
$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);
}
}
}
?>
sleep() te gebruiken. Vraag me echter wel af op dat de juiste oplossing is.
Heb dat zelf opgelost door Gewijzigd op 28/04/2011 10:45:05 door Ben Elsinga
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...
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 -
Ik heb even naar curl_multi_init gekeken, ook naar voorbeelden, maar snap niet helemaal hoe dat mijn probleem moet verhelpen...
Zet tussen de feeds een link naar een eigen PHP-script dat sleep(30) doet, dat zou je timeout wel moeten triggeren.
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...