Op het moment haal ik wat informatie binnen via een API. Nu komt het wel eens voor, dat ik de rate limit overschrijd. Dus zou ik graag een if-statement maken die deze header opvangt en wanneer deze daadwerkelijk 429 is. 10 sec slaapt en vervolgens de loop opnieuw uitvoert

<?php


$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,);

foreach($array AS $value){

$api_key = '000-000-000-000';
$url = 'https://api.url.com/' . $value . '?api_key=' . $api_key;

// Open connection
$ch = curl_init();

// Set the url, number of GET vars, GET data
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

// Execute request
$result = curl_exec($ch);

// Check for 429
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// Close connection
curl_close($ch);


if($httpCode == 429) {

echo 'error: 429<br>';

// sleep(10);
// loop this foreach again

} else {

echo "<pre>";
print_r($result);
echo "</pre>";

}

}

?>
Definieer "wat informatie".

Onthoud je ook eerder opgehaalde informatie? Zo nee: overweeg dat in plaats van deze constructie.

Rate limits zijn normaal best schappelijk volgens mij (of de dienst is gratis, in beide gevallen krijg je op den duur wat je betaalt :)), en zijn er niet voor niets.
wil je de hele loop opnieuw starten, of vanaf de laatste poging verder gaan?

<?php


$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,);

// Open connection
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$api_key = '000-000-000-000';

foreach($array AS $value){


$url = 'https://api.url.com/' . $value . '?api_key=' . $api_key;

// Set the url, number of GET vars, GET data
curl_setopt($ch, CURLOPT_URL, $url);

do {
// Execute request
$result = curl_exec($ch);

// Check for 429
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($httpCode == 429) {
echo 'error: 429<br>';
sleep(10);
// we zullen de curl_exec dus opnieuw gaan doen.
}
} while ($httpCode == 429);

echo "<pre>";
print_r($result);
echo "</pre>";

}
// Close connection
curl_close($ch);

?>
Wil je misschien ook je timelimt uitschakelen, anders timeout je script.

Maar je hebt dan niet echt garantie van "eindiging".

Het lijkt mij beter om bij te houden waar je was gebleven, zodat je iig geen dingen dubbel doet.

Dit komt dus uiteindelijk toch weer bij een oplossing uit waaarbij je dingen opslaat.

Tenzij het je doel is om een API continu plat te bombarderen met dezelfde verzoeken?

Ik kan ook niet opmaken wat je script uiteindelijk *doet*. Alleen maar output produceren waar je verder niets mee doet? Wat is je uiteindelijke doel?
Uiteraard sla ik het meeste op. Dit is ook maar een voorbeeld om mijn vraag wat duidelijker te maken. Het gaat hier niet alleen om de foutmelding "rate limit" (deze zijn overigens zeer schappelijk) het kan elke melding zijn. Mijn vraag is: kan ik de pointer van de foreach één terug zetten zodat hij nogmaals de zelfde loop maakt? dus niet de hele loop alleen het laatste element waar de foutmelding is ontstaan.

Of zou ik voor een loop als deze, waar ik soms een stap terug zou willen voor een for-loop moeten gaan?? Zo ja, is er dan ook een mogelijkheid om een key-element mee te geven?
zoiets als mijn code hierboven?

die zou elke 10 seconden de waarde blijven herhalen, totdat het antwoord geen 429 (meer) is
Ah, ik had heel je post niet gezien. Dat is een geweldig idee, ik zat een beetje vast in mijn denkpatroon met die foreach-loop maar dit werkt misschien nog wel beter. Bedankt.

Reageren