Slack PHP API - Zeitüberschreitungsfehler vermeiden

8

Ich versuche, den Slack Custom-Befehl zu verwenden und nicht sicher zu sein, wie man verzögerte Nachrichten seit dem Yoda Speak verwendet Die externe API braucht mehr als 3 Sekunden, um zu antworten.

Ich habe Folgendes getan:

  • Habe in meinem Fall den Slack-Befehl /Yoda gesendet und die reponse_url .
  • erhalten
  • Folgendes wurde verwendet, um post zum URL der Antwort zu verwenden:
%Vor%

  • Jetzt, wenn ich die Yoda-API aufruft, gibt es den folgenden Fehler "Timeout wurde erreicht". Ich habe über verzögerte Antworten gelesen, bin mir aber nicht sicher, wie ich von hier aus fortfahren soll.
%Vor%

Kann mir jemand bitte sagen, wie man den Timeout-Fehler durch verzögerte Antworten beseitigt?

AKTUALISIERTER CODE:

%Vor%

Ich bekomme immer noch den gleichen Fehler "Darn - dieser Schrägstrichbefehl hat nicht funktioniert (Fehlermeldung: Timeout was reached ). Verwalte den Befehl unter slash-command"

    
Vimalnath 24.03.2016, 08:30
quelle

5 Antworten

6

Sie machen die richtigen Dinge, müssen nur die Reihenfolge ändern.

  1. Reagieren Sie sofort auf die ursprüngliche Anfrage mit einer 200 OK Antwort. Weitere Informationen finden Sie diese Antwort , aber im Wesentlichen:

    %Vor%
  2. Dann machen Sie die Yoda-API-Anfrage mit curl, wie Sie es gerade tun

  3. Sobald Sie die Yoda-Ergebnisse erhalten haben, senden Sie sie an Slack at $response_url mit curl, wie Sie es tun.
rcoup 30.03.2016 14:30
quelle
1

Von dem, was ich in der Dokumentation sehen kann , machst du die Dinge meistens richtig. Wenn Sie etwas aussprechen, geben Sie bereits eine 200-OK-Nachricht ab, also müssen Sie dies nicht explizit tun. Sie sollten überprüfen, ob dies kein Serverproblem ist. Ist die URL gültig? Wird nicht durch eine Rewrite-Regel auf dem Weg gestört?

Ich habe im Folgenden einige Änderungen an Ihrem Code vorgenommen, einschließlich einiger Debugging-Funktionen, die in Ihr Fehlerprotokoll (standardmäßig das Fehlerprotokoll von Apache) gehen. Probieren Sie es aus und Sie haben zumindest noch mehr Debugging-Details.

%Vor%     
miken32 22.04.2016 21:11
quelle
1

Wenn Sie FPM verwenden, dann ist dies das, was Sie wollen - Ссылка

Ihr Code würde dann so aussehen ...

%Vor%     
Dan 31.07.2017 14:09
quelle
0

Ich gebe eine Antwort ein, da ich nicht genug Reputation habe, um Kommentare zu posten ...

Ich hatte das gleiche Problem, und dann wurde mir klar, dass Slack Anfragen und Antworten anders behandelt. Insbesondere unterscheiden sich HTTP-Anfrage und Antwort in ihrer ersten Zeile.

HTTP-Anfrage Beispiel:

%Vor%

HTTP-Antwortbeispiel:

%Vor%

Wenn Sie auf rohe Bytes zugreifen können, die in PHP gesendet werden sollen (nie verwendetes PHP, also nicht vertraut), lassen Sie es einfach als Antwort und nicht als Anfrage aussehen. Andernfalls senden Sie sofort eine Antwort, dann erledigen Sie die Arbeit, die Sie benötigen, und senden Sie eine Anfrage mit der neuen Nachricht. Dies kann auf verschiedene Arten geschehen, von denen eine von @ miken32 beschrieben wurde. Ich habe mich dafür entschieden, einen Hintergrundprozess in Python aufzurufen.

    
Saša Vučković 01.02.2017 10:00
quelle
0

Ein weiterer Ansatz, der funktioniert, ist die Verwendung einer Curl-Anfrage mit einem kurzen Timeout, um ein zweites PHP-Skript zu erzeugen. Da mein Anbieter meine PHP-Umgebung eingeschränkt hat (z. B. kein Prozess-Launch), war dies der einzige Ansatz, der für mich funktioniert hat.

Das erste Skript wird kurz danach beendet und sendet ein HTTP OK zurück an Slack. Das zweite Skript wird weiter ausgeführt, übernimmt die zeitaufwendige Verarbeitung (z. B. den Aufruf externer APIs) und sendet das Ergebnis schließlich als verzögerte Antwort an response_url .

1. Skript

Dies ist die Curl-Anfrage in Ihrem ersten Skript:

%Vor%

Die Länge der Timeouts ist willkürlich, aber in meinen Tests hat ein sehr kurzer Timeout (z. B. 10ms) nicht funktioniert.

Sie müssen auch einen Weg implementieren, um Eingabedaten zwischen den beiden Skripten zu übertragen, wie dargestellt, indem Sie den Parameter request_url als URL übergeben.

Abschließend müssen Sie für Slash-Befehle eine kurze Antwort an den Benutzer senden.

2. Skript

So sieht Ihr zweites Skript aus:

%Vor%

Die Anweisung ignore_user_abort(true); ist obligatorisch, um sicherzustellen, dass Ihr zweites Skript nach dem curl-Timeout weiterläuft.

Das usleep mit 0,5 Sekunden soll sicherstellen, dass das zweite Skript nach dem ersten reagiert, aber nicht zwingend, damit diese Lösung funktioniert.

Das Beispiel basiert auf einer Antwort der " PHP-Ausführung nach dem Senden fortsetzen HTTP-Antwort "Frage.

    
Erik Kalkoken 16.02.2017 11:35
quelle

Tags und Links