Ich frage mich, wie ich damit umgehen soll. Ich habe einen Webhook-Endpunkt, der auf einen Webhook-Anruf von Github reagiert.Antwort senden, aber Skript lange laufen lassen, um Timeout zu verhindern?
Es startet einen lang andauernden Prozess, in dem es das Repository klont, von dem der Webhook-Aufruf gemacht wurde.
/**
* The webhook endpoint.
*
* @param Request $request
* @return mixed
* @throws \Exception
*/
public function webhook(Request $request)
{
// The type of GitHub event that we receive.
$event = $request->header('X-GitHub-Event');
$url = $this->createCloneUrl();
$this->cloneGitRepo($url);
return new Response('Webhook received succesfully', 200);
}
Das Problem dabei ist, dass Github einen Fehler gibt, wenn die Antwort nicht schnell genug zur Verfügung gestellt wird.
Wir könnten diese Nutzlast nicht liefern: Service-Timeout
Dies ist zu Recht so, weil meine cloneGitRepo
Methode einfach ist die Ausführung der Reaktion blockiert und es dauert zu lange.
Wie kann ich immer noch eine Antwort liefern, um Github zu bestätigen, dass der Webhook-Aufruf erfolgreich durchgeführt wurde und mein lang andauernder Prozess gestartet wurde?
Ich benutze Laravel für all dies mit Redis, vielleicht kann dort etwas erreicht werden? Ich bin offen für alle Vorschläge.
Sie verwenden sollten [Queues] (https: // Laravel .com/docs/5.5/Warteschlangen) – ljubadr
Mit Docs __Queues können Sie die Verarbeitung einer zeitaufwendigen Aufgabe verzögern, z. B. das Senden einer E-Mail, bis zu einem späteren Zeitpunkt. Wenn Sie diese zeitaufwendigen Aufgaben verschieben, werden die Webanfragen für Ihre Anwendung drastisch beschleunigt. __ – ljubadr
Oder Sie können [Asynchrone Prozesse ausführen] (https://symfony.com/doc/current/components/process.html#running-processes-asynchronous) verwenden), da die 'Symfony \ Component \ Process \ Process' bereits von Laravel enthalten ist ... – ljubadr