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:
/Yoda
gesendet und die reponse_url
. post
zum URL der Antwort zu verwenden: %Vor%
%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"
Sie machen die richtigen Dinge, müssen nur die Reihenfolge ändern.
Reagieren Sie sofort auf die ursprüngliche Anfrage mit einer 200 OK
Antwort. Weitere Informationen finden Sie diese Antwort , aber im Wesentlichen:
Dann machen Sie die Yoda-API-Anfrage mit curl, wie Sie es gerade tun
$response_url
mit curl, wie Sie es tun. 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%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.
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.