504 gateway timeout auf AWS ec2, ohne Sie lange im php-Skript

Den ich gestoßen bin http 504-gateway-timeout-Fehler mehrmals, wenn ich versuche zu nennen, einen GET-API, programmiert mit PHP.

Hier ist mein server und AWS-Umgebung.

  • Eine Amazon ec2-Instanz mit Linux, das ausführen von php-code (5.4.40) mit apache-server (2.4.12) zu dienen api-Aufruf von client.
  • Eine AWS elastic load balancer balance traffic auf einer meiner Instanzen. (für jetzt, ich habe nur eine Instanz, nur setzen ELB für die Zukunft, falls ich weitere instances benötigen, um den Umgang mit dem Datenverkehr.)
  • Eine AWS RDS-Datenbank (MySQL 5.6.21) zum speichern von Daten.

Aus einigen Artikeln über 504 gateway timeout, ich habe bereits versucht, diese Einstellungen zu ändern:

 # ELB
 idle timeout => 300

 # php.ini
 max_execution_time => 301
 max_input_time => 301

 # httpd conf
 MaxKeepAliveRequests => 100
 KeepAliveTimeout => 30

Aber alle von Ihnen sind nicht hilfreich für mich, es bekommen immer noch 504 gateway timeout manchmal.

Mein php-Skript ist nicht ein langes script, es bekommen nur die Daten aus der mysql-Datenbank (AWS RDS) aus 3 Tabellen und Daten zurück zum client, nicht beim hochladen der Datei oder generateing große Datei, so dass ich denke, die Ausführungszeit ist nicht das problem.

Das merkwürdige ist, dass der 504-gateway-timeout-Fehler nicht immer passiert ist, die meisten der Zeit, es ist normal, passiert nur MANCHMAL, für jetzt, ich verstehe immer noch nicht, wenn 504 Fehler passiert, es ist wirklich merkwürdig, wenn jemand kann mir einige Vorschläge darüber, wie dieses problem zu beheben, es ist wirklich eine große Gunst für mich.

=== Neues Update ===

Den ich gerade gefunden habe ein problem in meinem php-code, ich dachte, dass der namespace mit autoload problem.

Habe ich 2 php-Dateien in den gleichen Ordner, es bedeutet, die 2 Klassen mit dem gleichen namespace

Dateien:

My/Namespace
  - Class1.php
  - Class2.php

Klassen-und namespace:

Class1

//Class1
namespace My\Namespace;
class Class1 {
    public static function getInstance() {
        //return...
    }
}

Class2

//Class2
namespace My\Namespace;
class Class2 {
    public static function getInstance() {
        //return...
    }

    public function getClass1Instance() {
        $class1 = Class1::getInstance();
        return $class1;
    }
}

In Class2.php ich versuche zu rufen Class1 die statische Funktion, aber ich habe nicht hinzufügen "use namespace", so dass ich fügen Sie die folgende Zeile Class2.php

use My\Namespace\Class1;

Problem war gelöst! Aber ich habe noch nicht wirklich sicher, warum sollte ich noch hinzufügen "verwenden-namespace" auf Class2.php Class1 und Class2 sind beide in der gleichen namespace, sollte ich hinzufügen, "use namespace" auch wenn Sie sind in der gleichen namespace?

p.s. Ich fand diese namespace-problem, weil bei der 504-gateway-Fehler passiert ist, habe ich versucht, rufen Sie die API viele Male in einem kurzen Zeitraum, und die php-Fehlermeldung angezeigt, und Sag mir,

"Class1 wird nicht gefunden Class2.php"

aber manchmal php-Fehlermeldung zeigen

"Nicht aufrufen kann, eine überladene Funktion in Class2.php, getClass1Instance()"

Wünsche ich genügend Nachricht über diese Frage, und vielen Dank für alle, die Links kommentieren oder meine Frage beantwortet, m(_ _)m

  • Wie lange dauert es, wenn es normal arbeitet? Außerhalb von web sockets, lang laufende Anfragen werden in der Regel nicht so toll für http.
  • Wenn API, führen in der Regel dauert es 200~1000 ms basierend auf der Geschwindigkeit des internet, ich glaube nicht, dass es eine lang laufende Anfrage.
  • Sind Sie php im fcgi-Modus oder mod_php? Sehen Sie alles in der apache-error-log mit Bezug zu den Anforderungen?
  • Im nicht ganz sicher über fcgi Modus und mod_php, habe ich versucht, zu überprüfen, phpinfo() und finden Sie unter "Server API" parameter "Apache 2.0 Handler", bedeutet das, dass mod_php? Und die logs sieht normalerweise. Ich fand, dass mein php-script mit Abfrage-Datenbank 18 mal in ein Verfahren, ist es der Grund?
  • Haben Sie den Apache timeout? Siehe: stackoverflow.com/a/9630627/2838391 ? Auch gibt es nichts in der elastic beanstalk-Protokolle zu dieser Zeit?
  • kannst du in jedem php und/oder apache-log-details rund um die Zeit der Anträge aus?
  • Dank snkashis und Rakesh Bollampally, ich habe die logs, sieht gut aus, und es könnte sein, meine php-code-Fehler habe ich nur aktualisieren, meine Frage zu erklären, was ich fand, wirklich vielen Dank für Eure Ratschläge

InformationsquelleAutor Kai | 2015-05-17
Schreibe einen Kommentar