tobi85: AJAX bricht ab

Hallo,

ich habe ein Problem und hoffe sehr, mir kann jemand einen Tipp finden, wie ich einen Fehler lokalisieren kann.

Mittels AJAX rufe ich ein PHP-Skript auf. In 98% wird das Skript aufgerufen und ich bekomme auch eine Response. Nun kommt es manchmal vor, dass das Skript nach 200-300ms einfach abgebrochen wird. Im FF ist dann der Aufruf-Link rot und dahinter ein rotes X. Wenn ich dann genau die gleiche Anfrage nochmals absende, wird das Skript wieder ganz normal abgerufen und es kommt auch wieder eine Response. Ich habe auch bereits bei PHP den Error-Report mit Ausgabe aktiviert, allerdings wird da auch nicht mal ein Fehler ausgegeben.

Was kann ich machen, um zumindest den Fehler zu lokalisieren.

  1. Hallo

    Mittels AJAX rufe ich ein PHP-Skript auf. In 98% wird das Skript aufgerufen und ich bekomme auch eine Response.
    Nun kommt es manchmal vor, dass das Skript nach 200-300ms einfach abgebrochen wird. Im FF ist dann der Aufruf-Link rot und dahinter ein rotes X. Wenn ich dann genau die gleiche Anfrage nochmals absende, wird das Skript wieder ganz normal abgerufen und es kommt auch wieder eine Response.
    Ich habe auch bereits bei PHP den Error-Report mit Ausgabe aktiviert, allerdings wird da auch nicht mal ein Fehler ausgegeben.

    Lässt du die PHP-fehler anzeigen oder in eine Datei schreiben? Generiert das Skript überhaupt eine im Browser anzeigbare Ausgabe?

    Was kann ich machen, um zumindest den Fehler zu lokalisieren.

    • PHP: Error-Reporting auf höchste Stufe stellen und Meldungen in Logdatei schreiben lassen
    • JavaScript/Ajax: Browserkonsole benutzen und bei Bedarf mit Stoppunkten im Skript mit der Konsole die Inhalte der Variablen prüfen (Steht dort drin, was du erwartest?).

    Tschö, Auge

    --
    Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
    Wolfgang Schneidewind *prust*
  2. Tach!

    Was kann ich machen, um zumindest den Fehler zu lokalisieren.

    Neben dem PHP Errorlog kann auch das vom Webserver einen Eintrag enthalten, besonders dann, wenn es sich nicht um einen Fehler im PHP-Script handelt. Vielleicht hat auch das Systemlog noch etwas zu bieten.

    dedlfix.

    1. Hallo und Danke für Eure Tipps.

      Also PHP-Error steht bereits auf höchster Stufe und es wird leider nichts ausgegeben. Des kuriose ist - bei Firebug kommt eben manchmal nach wenigen Millisekunden dieser Error. Parallel gebe ich noch mit LIVE HTTP headers den Header aus. Wenn es zu diesem "Error" kommt, wird kein Header ausgegeben.

      Mein Problem ist wirklich, dass ich keine AHnung habe, wo ich überhaupt anfangen könnte zu suchen und der Fehler ja wirklich sehr sehr sporadisch ist.

      1. Hi,

        Des kuriose ist - bei Firebug kommt eben manchmal nach wenigen Millisekunden dieser Error. Parallel gebe ich noch mit LIVE HTTP headers den Header aus. Wenn es zu diesem "Error" kommt, wird kein Header ausgegeben.

        keine Header heißt mit an Sicherheit grenzender Wahrscheinlichkeit, dass das serverseitige Script (PHP) gar nicht erst gestartet wird, d.h. der Request gar nicht beim Server ankommt oder nicht von ihm bearbeitet wird.
        Geht denn der Request korrekt raus? LiveHTTP müsste auch die Request-Header zeigen.

        Mein Problem ist wirklich, dass ich keine AHnung habe, wo ich überhaupt anfangen könnte zu suchen und der Fehler ja wirklich sehr sehr sporadisch ist.

        Ja, ich weiß - Fehler, die nicht exakt und gezielt reproduzierbar sind, lassen sich sehr schwer lokalisieren und identifizieren.

        So long,
         Martin

        --
        Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
        - Douglas Adams, The Hitchhiker's Guide To The Galaxy
        1. Hallo Martin,

          also der Request-Header wird hier wohl nicht angezeigt - ich kann lediglich über Firebug den Header anzeigen lassen und da ist der korrekt.

          Anbei mal beide Header. Bei Header 1 hat das es nach 299ms abgebrochen. Bei Header 2 kam nach 306ms eine Response

          Accept	*/*
          Accept-Encoding	gzip, deflate, br
          Accept-Language	de,en-US;q=0.7,en;q=0.3
          Content-Length	19
          Content-Type	application/x-www-form-urlencoded; charset=UTF-8
          Cookie	XXX
          Host	www.domain.com
          Referer	https://www.domain.com/
          User-Agent	Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
          X-Requested-With	XMLHttpRequest
          
          
          Accept	*/*
          Accept-Encoding	gzip, deflate, br
          Accept-Language	de,en-US;q=0.7,en;q=0.3
          Content-Length	19
          Content-Type	application/x-www-form-urlencoded; charset=UTF-8
          Cookie	XXX
          Host	www.domain.com
          Referer	https://www.domain.com
          User-Agent	Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
          X-Requested-With	XMLHttpRequest
          
          1. Wer erzeugt den Content-Length Header, Machst Du das mit deinem Code oder überlässt Du das dem XHR-Objekt?

            1. Sorry - was? Habe ich leider nicht verstanden.

              Was auch interessant ist. Wenn ich zum Beispiel per Ajax eine URL aufrufe, die es nicht gibt, wird im Firebug der Fehler 404 angezeigt. Wenn ich im Skript absichtlich einen Fehler einbaue, wird auch im Firebug der Error 500 angezeigt. Bei dem Error, den ich aber nicht nachstellen kann, wird nichts angezeigt, sondern es kommt nur die URL in rot und daneben das rote X mit der Millisekunden-Angabe.

              1. Sorry - was? Habe ich leider nicht verstanden.

                Zeig JavaScript

              2. Hallo

                Wenn ich zum Beispiel per Ajax eine URL aufrufe, die es nicht gibt, wird im Firebug der Fehler 404 angezeigt.

                Logisch, oder? Du rufst eine auf dem Server nicht vorhandene Ressource auf. Wenn du diese nicht vorhandene Ressource über die Adresszeile aufrufst, wird dem Browser vom Server der Status „404 not found“ zurück gemeldet. Warum sollte das bei einem Request per Ajax anders sein? (siehe HTTP-Statusmeldungen, Client-Fehler)

                Wenn ich im Skript absichtlich einen Fehler einbaue, wird auch im Firebug der Error 500 angezeigt.

                Auch logisch, wenn es sich dabei, wie anzunehmen ist, um das PHP-Skript handelt. (siehe HTTP-Statusmeldungen, Server-Fehler)

                Bei dem Error, den ich aber nicht nachstellen kann, wird nichts angezeigt, sondern es kommt nur die URL in rot und daneben das rote X mit der Millisekunden-Angabe.

                Dann wird entweder bei der Verarbeitung des PHP-Skripts kein Fehler auftreten, der in eine 500-er-Meldung mündet, oder der Fehler tritt nicht im PHP-Skript selbst auf.

                Tschö, Auge

                --
                Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
                Wolfgang Schneidewind *prust*
      2. Tach!

        Also PHP-Error steht bereits auf höchster Stufe und es wird leider nichts ausgegeben.

        Wohin ausgegeben? Es gibt nicht nur eine Stelle, an die PHP seine Fehlermeldungen schreibt. Bitte benenne genauer die Stellen, an denen du nachschaust. Und nein, allein die Ausgabe in den Browser reicht nicht. Wenn PHP aus Gründen nichts zu ihm senden kann, dann auch keine Fehlermeldungen. Deswegen nannte ich die anderen Orte, an denen man fündig werden kann.

        dedlfix.

        1. Hallo, wie folgt - korrekt?

          php.ini error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

          log_errors = On

          error_log = php_errors.log

          1. Tach!

            Du solltest schon etwas genauer auf meine Hinweise eingehen, sonst komme ich mir ignoriert vor und spare mir das Antworten.

            Hallo, wie folgt - korrekt?

            Soweit ja, aber das ist nur das Error-Log von PHP. Was ist mit den anderen Log-Quellen: Webserver-Logfiles, System-Logfiles? Wenn du nicht weißt, wie du an sie rankommst, aber es generell könntest, dann sag das. Wenn du sie nicht einsehen kannst, dann ist es sowieso schlecht, denn hellsehen kann keiner.

            dedlfix.

            1. Hallo, mit den anderen LOG-Files wird es schon schwieriger. Als Webserver nutzen wir NGINX und als Betriebssystem UBUNTU.

              Würde mich freuen, wenn Du mir sagen könntest, welche LOG-Files ich wo anstellen soll.

              Bei dem PHP-Error-Log kommen nun einige PHP Warning-Fehler. Das meiste ist mysql_result() unable to jump row 0 etc. Kann ich PHP Warning-Meldungen auch deaktiveren?

              1. Tach!

                Als Webserver nutzen wir NGINX und als Betriebssystem UBUNTU.

                Für Ubuntu weiß ich grad nicht, ob es messages oder syslog in /var/log/ ist. Aber auch alles was in dem Verzeichnis mit aktueller Modifikationszeit kann Hinweise enthalten.

                Wie nginx seine Logs verwaltet, weiß ich nicht. Der hat aber bestimmt irgendwo ein Error-Log.

                Bei dem PHP-Error-Log kommen nun einige PHP Warning-Fehler. Das meiste ist mysql_result() unable to jump row 0 etc. Kann ich PHP Warning-Meldungen auch deaktiveren?

                Am besten ist es, die Ursache zu beseitigen. Mit @ vor der Funktion sozusagen den Deckel auf den Topf zu legen, beseitigt nicht dessen dahinsiechenden Inhalt.

                dedlfix.

              2. Hallo

                Hallo, mit den anderen LOG-Files wird es schon schwieriger. Als Webserver nutzen wir NGINX und als Betriebssystem UBUNTU.

                Würde mich freuen, wenn Du mir sagen könntest, welche LOG-Files ich wo anstellen soll.

                Was sagt euer Admin?

                Bei dem PHP-Error-Log kommen nun einige PHP Warning-Fehler. Das meiste ist mysql_result() unable to jump row 0 etc. Kann ich PHP Warning-Meldungen auch deaktiveren?

                Die kannst du mit dem „@“ vor dem Funktionsaufruf unterdrücken (also z. B. @mysql_query). Das ist ganz besonders dann eine zielführende Strategie, wenn du nicht ausschließen kannst, dass genau in diesen gemeldeten Fehlern die Ursache liegen könnte.

                So, Sarkasmus abgeschaltet. Frage: Spricht dein per Ajax angestoßenes PHP-Skript mit deinem MySQL-Server?

                Tschö, Auge

                --
                Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
                Wolfgang Schneidewind *prust*
                1. So, Sarkasmus abgeschaltet. Frage: Spricht dein per Ajax angestoßenes PHP-Skript mit deinem MySQL-Server?

                  Sorry - aber was meinst Du damit? Ja, bei diesem Skript wird auch eine MySQL Abfrage gestartet.

                  Ich habe gerade mal beim NGINX den Accesslog aktiviert und es kommt wohl nicht mal die Anfrage beim Server an.

                  Und noch was - das Problem kommt meistens dann, wenn ich ein paar Minuten nicht auf der Seite war. Wenn ich dann einmal das Skript aufgerufen hatte und danach auf der Seite arbeite, ist alles OK

                  1. Hallo

                    So, Sarkasmus abgeschaltet. Frage: Spricht dein per Ajax angestoßenes PHP-Skript mit deinem MySQL-Server?

                    Sorry - aber was meinst Du damit?

                    Was ist daran unklar?

                    Bei dem PHP-Error-Log kommen nun einige PHP Warning-Fehler. Das meiste ist mysql_result() unable to jump row 0 etc. Kann ich PHP Warning-Meldungen auch deaktiveren?

                    … Das [Unterdrücken der Fehlermeldung] ist ganz besonders dann eine zielführende Strategie, wenn du nicht ausschließen kannst, dass genau in diesen gemeldeten Fehlern die Ursache liegen könnte.

                    Ja, bei diesem Skript wird auch eine MySQL Abfrage gestartet.

                    Die im MySQL-Teil gelegentlich auftretenden Fehler könnten die Ursache für dein Problem sein. Die Fehlermeldung zu unterdrücken statt die Fehlerursache zu beseitigen, würde, wenn das zutreffen sollte, dein Problem nicht beheben. Stattdessen würde es dafür sorgen, dass du nie und nimmer die Ursache erkennen würdest und der Fehler somit weiterhin auftreten würde.

                    Ich habe gerade mal beim NGINX den Accesslog aktiviert und es kommt wohl nicht mal die Anfrage beim Server an.

                    Das mit Ajax angesprochene PHP-Skript wird überhaupt nicht gestartet?

                    Tschö, Auge

                    --
                    Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
                    Wolfgang Schneidewind *prust*
                    1. Hallo,

                      ja scheinbar wird das PHP-Skript erst gar nicht gestartet, bzw. erscheint es in jedem Fall nicht in den logs.

                      Wie kann ich denn am besten bei MySQL die Fehler anzeigen lassen, bzw. schauen, ob es ein Problem gibt.

                      1. Hallo

                        ja scheinbar wird das PHP-Skript erst gar nicht gestartet, bzw. erscheint es in jedem Fall nicht in den logs.

                        Wie kann ich denn am besten bei MySQL die Fehler anzeigen lassen, bzw. schauen, ob es ein Problem gibt.

                        Dass es immer wieder mal ein Problem gibt, sagt dein eigenes Log. Du kannst dir Statusnummern und -meldungen des MySQL-Servers an PHP zurückgeben lassen. In der alten Schnittstelle ging das über die Funktionen mysql_errno() und mysql_error(). Beachte: Die alte Schnittstelle ist deprecated und in PHP 7 nicht mehr enthalten. Die neuen Schnittstellen haben aber vergleichbare Wege, an die MySQL-Meldungen zu kommen.

                        Da du das PHP-Skript ohne direkte Ausgabe an den Browser aufrufst, musst du zuerst die Rückgabewerte der Funktionen prüfen [1] und die Fehlermeldung bzw. den Status in eine Datei schreiben.

                        Tschö, Auge

                        --
                        Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
                        Wolfgang Schneidewind *prust*

                        1. mysql_error: Leerstring oder Meldung, mysql_errno: ohne Fehler 0, bei Fehler > 0. bei den neuen Schnittstellen entsprechend deren Rückgabewerte. ↩︎

                        1. Also, ich bin nun bereits etwas weiter gekommen, allerdings den Fehler konnte ich noch immer nicht genauer eingrenzen.

                          Bei Error gebe ich nun jqXHR Status aus und ich bekomme bei dem Error den Statuscode 0, was bedeutet "not connect. verify network"

                          Ich habe auch mal bei einer PHP-Datei den Inhalt komplett entfernt, so dass die Datei leer war, um zu prüfen, ob es an MySQL/PHP liegt, oder nicht. Auch bei einer leeren Datei bekomme ich den Error - aber warum?

                          Die Internetverbindung ist in jedem Fall da und der Fehler tritt nur auf, wenn ich ein paar Minuten nicht auf der Seite war.

                          1. Tach!

                            Bei Error gebe ich nun jqXHR Status aus und ich bekomme bei dem Error den Statuscode 0, was bedeutet "not connect. verify network"

                            Das sieht mir dann doch eher nach einem Verbindungsfehler aus. Ich würde da mit Werkzeugen wie dem Fiddler oder dem Leitungshai (Wireshark) ans Werk gehen.

                            Tritt das eigentlich nur bei dir auf oder haben andere auch das Problem? Falls das nur bei dir ist, dann vielleicht auch einen Blick in den Event-Viewer werfen, ob da netzwerkrelevante Meldungen drinstehen, wenn du eine Windows-Maschine hast.

                            dedlfix.

                            1. Hallo, das kuriose ist, es ist bei uns in der Firma bei jedem User UND es war auch bei mir Privat - also anderer Internetzugang.

                              1. Tach!

                                Hallo, das kuriose ist, es ist bei uns in der Firma bei jedem User UND es war auch bei mir Privat - also anderer Internetzugang.

                                Dann kann es immer noch am Netzwerk in der Umgebung des Servers liegen.

                                dedlfix.