2016-07-28 10 views
0

Wenn eine bestimmte Bedingung erfüllt ist, wie kann ich die Funktion:In PHP, wie man die Funktion stoppt, wartet und rekursiv sich selbst neu startet, bis eine Bedingung erfüllt ist?

  1. Stopp, um den Rest der Funktion
  2. X Zeit warten
  3. Starten Sie die Funktion

Wäre es etwas sein, die Ausführung wie:

function someFunc() { 
    if (x == 0) { 
     sleep(60); 
     someFunc(); 
     return; 
    } 
    ...other code only to be run if above is false... 
} 
someFunc(); 

...other code only to be run if above function finishes running completely... 

Falls es relevant ist und es gibt einige Bibliothek um APi-Limits oder sowas zu behandeln, mache ich dies für eine API-Verbindung. Zuerst erhalte ich einen Webhook-Hit über

file_get_contents('php://input') 

, die eine URL enthält. Dann traf ich die URL mit

file_get_contents($url) 

und nach $http_response_header in eine $headers Array Parsen, überprüfen Sie es als if ($header['api_limit'] == 0) ... (im obigen Beispiel ist dies x) Header. Wenn "x" 0 ist, möchte ich, dass die Funktion eine Minute wartet, bis der Grenzzyklus zurückgesetzt wird, und die zweite file_get_contents($url) und die darauffolgende Analyse erneut ausführen.

Der Hauptgrund, warum ich damit umgehen wollte, ist, dass ich nichts aufnehmen muss. Der Webhook, den ich über file_get_contents('php://input') erhalte, passiert nur einmal. Wenn das API-Ratenlimit erreicht wird und ich versuche, die URL im Webhook zu verwenden, aber fehlschlägt, ist die URL verloren. Also ich hatte gehofft, die Funktion würde nur X Zeit warten, bis die rte zurückgesetzt wird, bis Sie versuchen, die Webhook-empfangene URL mit file_get_contents($url) wieder zu verwenden. Ist das irgendwie schlecht?

+0

In Bezug auf den Aufbau einer logischen Speicher und cron Verarbeitung Skript Gegensatz? –

+0

Das klingt grob und ein bisschen komplex, nein? Ist die Methode, die ich vorschlage, schlechtes Gedächtnis oder aus irgendeinem anderen Grund? –

+0

Der Hauptgrund, warum ich damit umgehen wollte, ist, nichts aufzeichnen zu müssen. Der Webhook, den ich über 'file_get_contents ('php: // input') 'erhalte, passiert nur einmal. Wenn das API-Ratenlimit erreicht wird und ich versuche, die URL im Webhook zu verwenden, aber fehlschlägt, ist die URL verloren. Also hatte ich gehofft, dass die Funktion nur X-Zeit warten würde, bis die rte zurückgesetzt wird, bis ich versuche, die von webhook empfangene URL erneut mit 'file_get_contents ($ url)' zu verwenden. Ist das irgendwie schlecht? –

Antwort

0

ich es wie folgt gelöst:

// This will be the testing variable, where in the actual script 
// we'll check the response code of file_get_contents 
$count = 0; 

function funcTwo(&$count) { 

    // Here I'd run file_get_contents and parse the headers 
    $count = ++$count; 
    echo "functTwo() running $count... \n";    

    // Here I'll test for response code 429, if true, restart 
    if ($count !== 5) { 
     echo "Count only = $count so we're gonna take a nap... \n"; 
     sleep(1);   
     echo "Waking from sleep $count and rerunning myself... \n"; 
     funcTwo($count); 
     return; 
    } 

    echo "Count finally = $count, exiting funcTwo... \n"; 

} 

// This function does the main work that relies on the successful response from 
function funcOne($count) { 

    echo "functOne() running! \n"; 

    // The function will be delayed here until a successful response is returned 
    funcTwo($count); 

    echo "Count finally = $count, so now we can finally do the work that \n"; 
    echo "depends on a successful response from funcTwo() \n"; 

    // Do main work 

    echo "Work done, exiting funcOne and script... \n"; 

} 

funcOne($count); 
2

Mit ratenbegrenzten Ressourcen möchten Sie normalerweise eine Kopie der Daten für Blöcke von X Minuten zwischenspeichern, so dass das Limit nie wirklich überschritten wird. Zum Beispiel würden Sie im Falle von maximal 10 Anfragen pro Stunde die Antwort für mindestens 6 Minuten zwischenspeichern, bevor Sie versuchen, eine neue Antwort zu holen.

Es ist keine gute Idee, den gesamten PHP-Interpreter anzuhalten, bis das Ratenlimit aufgehoben wird.

Im Allgemeinen geht es darum, "einen Versuch zu versuchen, etwas zu tun, bis es funktioniert", dies ist etwas, was PHP nicht gut behandelt, da Sie normalerweise einen Anfrage- und Antwortzyklus mit PHP so schnell wie möglich haben wollen gehe zur nächsten Anfrage. Ihre PHP-Anwendung sollte eine sofortige Ja/Nein-Antwort an ein externes Dienstprogramm liefern, das die Aufgabe in einem bestimmten Intervall auslöst.

+0

Warte, du meinst, wenn ein Webhook ein Skript unter "http:/api.myserver.com/parser-script.php" findet, und wenn diese Ausführung durch etwas wie "sleep();" oder nur durch Rekursion blockiert wird, dann Es kann keinen weiteren Webhook empfangen, bis die erste Skriptinitialisierung abgeschlossen ist. –

+1

@AndreBulatov Sie können weitere Informationen über diese bestimmte Abfrage [hier] (http://stackoverflow.com/questions/1430883/simultaneous-requests-to-php-script) erhalten. Das Bemerkenswerteste aus meiner Sicht ist, dass Anfragen vom gleichen Client in die Warteschlange gestellt werden. Daher kann der Client, der auf das Ratenlimit wartet, nicht mit anderen Teilen der PHP-Anwendung interagieren, bis er erfolgreich ist. – Marty

+0

ah, also erste Antwort ist "WordPress, doh!" Aber was ist der Kunde in diesem Fall? Das ist sehr aufschlussreich und doch scheint es für meine Methode kein Hindernis zu sein. Ich werde nur ungefähr 100-200 Webhook pro Tag erhalten, am meisten innerhalb von 1 Stunde, ungefähr um 11 Uhr. Das Ratenlimit beträgt 40 pro Minute. Also, es wird 40 analysieren, hängen, während es andere ankommende POSTs in die Warteschlange stellt, sobald das Limit zurückgesetzt wird, macht es ein oder zwei weitere Male dasselbe und fertig. Wäre das schlecht, wenn ich eine kleine Anzahl von POSTs für das Skript vorhersagen könnte? –

Verwandte Themen