Reverse Proxy Timeout umgehen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Reverse Proxy Timeout umgehen

    Hallo ihr,

    nach längerer Zeit mal wieder ein Frage von mir:

    Wir haben für einen Kunden ein Analysesystem gebastelt welche eine recht große Datenmenge (zur Zeit 1,7 Mio. Einträge) mittels count und diverser WHERE Bedingungen durchzählt und darstellt. Insgesamt sind das im schlimmsten Fall 270 Abfragen die an MySQL geschickt werden wo eine zwischen einer und sechs Sekunden braucht.

    Leider ist das Timeout bei unserem Kunden auf 120sec. gestellt und unser Script benötigt öfters mal etwas länger. (Es handelt sich um eine Analyse die nur sehr selten gemacht werden muss)

    Es handelt sich um einen Windowswebserver mit MySQL Datenbank.
    Wie das System genauer aufgebaut ist, wurde mir leider nicht verraten - warum auch immer.

    Ich hatte nun versucht einfach einen HTML Kommentar zwischen den Abfragen zu senden um diesen Timeout zu umgehen. Leider bin ich nicht soo fit in PHP und wollte mal nachfragen was ihr da machen würdet?

    Mein bescheidener Ansatz war dies hier:
    Code:
    echo "<!-- foobar -->";
    flush();
    ob_flush();
    Für jegliche Tipps / Infos wäre ich sehr dankbar.

  • #2
    Crossposting: Reverse Proxy Timeout umgehen - php.de
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
    der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

    "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

    Kommentar


    • #3
      Hallo,

      welche Optimierungsmaßnahmen habt ihr durchgeführt, um diese Abfragerei an sich schon schneller zu machen? Habt ihr die DB sinnvoll indiziert? Habt ihr Abfragen so aufgebaut, dass möglichst Equi-Joins benutzt werden? Habt ihr korrelierte Unterabfragen vermieden und weitestgehend unkorrelierte Unterabfragen oder Joins verwendet? Habt ihr die Datenbanktabellen so vorsortiert, wie sie auch bei der Abfrage hauptsächlich sortiert werden wird?

      Man kann die Scriptlaufzeit je nach Provider nicht immer beliebig verlängern. PHP kann das zwar, aber der Provider kann in seiner Hauptkonfiguration trotzdem festlegen, dass z. B. nach 120s Schluss ist, egal wie sehr du mit set_time_limit entgegensteuerst.

      Was aber geht: Eine Seite bauen, die eine kleine Portion abarbeitet, in der Session speichert, wie weit sie gekommen ist und sich dann selbst wieder aufruft. Da das mehrere Anfragen sind, gilt das Timeout nur für jede einzelne und in Summe kann so eine Seite durchaus sehr langwierige Arbeiten erledigen. Die Technik ist zwar nicht so schön und man sollte auch überlegen, ob man diese Aufgabe nicht eher als Cronjob erledigen kann und den Benutzer per E-Mail "zurückruft", wenn das Ergebnis fertig ist (vgl. auch browsershots.org), aber es wäre eine Möglichkeit.

      Gruß,

      Amica
      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
      Super, danke!
      [/COLOR]

      Kommentar


      • #4
        welche Optimierungsmaßnahmen habt ihr durchgeführt, um diese Abfragerei an sich schon schneller zu machen? Habt ihr die DB sinnvoll indiziert? Habt ihr Abfragen so aufgebaut, dass möglichst Equi-Joins benutzt werden? Habt ihr korrelierte Unterabfragen vermieden und weitestgehend unkorrelierte Unterabfragen oder Joins verwendet? Habt ihr die Datenbanktabellen so vorsortiert, wie sie auch bei der Abfrage hauptsächlich sortiert werden wird?
        Wir haben die einzelnen Felder mit Indizes versehen und mit explain
        getestet. Die Abfragen beinhalten keine Joins und auch keine Unterabfragen. Die Datenbanktabelle vorsortiert? Nein, wie ist das gemeint? Die Indizes stellen doch mehr oder weniger vorsortierte Tabelle dar oder nicht?

        Man kann die Scriptlaufzeit je nach Provider nicht immer beliebig verlängern. PHP kann das zwar, aber der Provider kann in seiner Hauptkonfiguration trotzdem festlegen, dass z. B. nach 120s Schluss ist, egal wie sehr du mit set_time_limit entgegensteuerst.
        Da dies ein rootserver ist, kann unser Kunde bzw sein Dienstleister dieses Tieout setzen wie es gebraucht wird. Hier geht es aber wohl nicht um die Scriptlaufzeit von php sondern um die Einstellungen des ReverseProxys, der nach 120sec ohne etwas zu senden abbricht. Es müsste also nur spätestens alle 120sec etwas gesendet werden wenn ich das richtig verstehe. :-/


        Was aber geht: Eine Seite bauen, die eine kleine Portion abarbeitet, in der Session speichert, wie weit sie gekommen ist und sich dann selbst wieder aufruft. Da das mehrere Anfragen sind, gilt das Timeout nur für jede einzelne und in Summe kann so eine Seite durchaus sehr langwierige Arbeiten erledigen. Die Technik ist zwar nicht so schön und man sollte auch überlegen, ob man diese Aufgabe nicht eher als Cronjob erledigen kann und den Benutzer per E-Mail "zurückruft", wenn das Ergebnis fertig ist (vgl. auch browsershots.org), aber es wäre eine Möglichkeit.
        In das Thema "in der Session speichern" muss ich mich mal eben einlesen. Einen Cronjob dafür anzulegen scheint auch nicht DIE Lösung zu sein, da der Kunde diverse Dinge filtern kann. Wenn ich alle Möglichkeiten vorab anlege hat der Server regelmäßig eine Menge unnütze Dinge zu tun.

        Sorry für das Crossponsting. Werde den Beitrag auf php.de löschen bzw löschen lassen.
        Zuletzt geändert von Bellringer; 14.04.2011, 12:38.

        Kommentar


        • #5
          Zitat von Bellringer Beitrag anzeigen
          Die Abfragen beinhalten keine Joins
          Vielleicht sollten sie das aber tun, vermutlich lässt sich dadurch die Anzahl der Abfragen wesentlich reduzieren.

          Zitat von Bellringer Beitrag anzeigen
          Die Datenbanktabelle vorsortiert? Nein, wie ist das gemeint?
          Lies mal im Handbuch zu ALTER TABLE den Abschnitt über ORDER BY.

          Zitat von Bellringer Beitrag anzeigen
          Hier geht es aber wohl nicht um die Scriptlaufzeit von php sondern um die Einstellungen des ReverseProxys, der nach 120sec ohne etwas zu senden abbricht. Es müsste also nur spätestens alle 120sec etwas gesendet werden wenn ich das richtig verstehe. :-/
          Das ließe sich beheben. Auch wenn du noch keine Ausgabe zusammengeklöppelt hast, weil du noch vorsortierst und pufferst oder ähnliches, kannst du dem Browser Leerzeilen oder HTML-Kommentare schicken (z. B. nach jeder Abfrage) und flushen, um etwas zum Senden zu haben.

          Zitat von Bellringer Beitrag anzeigen
          Einen Cronjob dafür anzulegen scheint auch nicht DIE Lösung zu sein, da der Kunde diverse Dinge filtern kann.
          Das kann er doch tun und diesen Auftrag könnte man dann erstmal mit allen Such- und Filterkriterien speichern. Dann kommt irgendwann der Cronjob vorbei, sieht sich diesen Auftrag an, arbeitet ihn ab, speichert das Ergebnis und schickt dem User eine E-Mail, dass es fertig ist.
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #6
            Vielleicht sollten sie das aber tun, vermutlich lässt sich dadurch die Anzahl der Abfragen wesentlich reduzieren.
            Leider nicht. Mit Datenbankabfragen kenn ich mich ganz gut aus.

            Lies mal im Handbuch zu ALTER TABLE den Abschnitt über ORDER BY.
            Bringt mich leider auch nicht weiter, da die Abfragen verschiedene sortierungen benötigen würde.


            Das ließe sich beheben. Auch wenn du noch keine Ausgabe zusammengeklöppelt hast, weil du noch vorsortierst und pufferst oder ähnliches, kannst du dem Browser Leerzeilen oder HTML-Kommentare schicken (z. B. nach jeder Abfrage) und flushen, um etwas zum Senden zu haben.
            Genau das funktioniert bei mir irgendwie nicht wirklich.
            Siehe Codebeispiel oben. Ich versuche einen HTML Kommentar zu senden und dann mittels flush() an den Browser zu schicken.

            Das kann er doch tun und diesen Auftrag könnte man dann erstmal mit allen Such- und Filterkriterien speichern. Dann kommt irgendwann der Cronjob vorbei, sieht sich diesen Auftrag an, arbeitet ihn ab, speichert das Ergebnis und schickt dem User eine E-Mail, dass es fertig ist.
            Das wäre dann wohl meine Alternative - dafür müsste ich aber ne Menge ändern und dafür hab ich eigentlich keine Zeit. (...und bezahlt würde es auch nicht)

            VIELEN DANK für deine Hilfe schon mal... Hast du vielleicht eine Idee warum das mit dem flush() nicht funktionieren könnte? Hat es evtl damit zu tun, dass es ein WindowsServer ist?

            Kommentar


            • #7
              Zitat von Bellringer Beitrag anzeigen
              Siehe Codebeispiel oben. Ich versuche einen HTML Kommentar zu senden und dann mittels flush() an den Browser zu schicken.
              Ach na eben, das hatte ich übersehen. Das flush-Problem bei Apache auf Windows ist bekannt, also dürfte das der Grund sein.
              Zuletzt geändert von AmicaNoctis; 14.04.2011, 13:15.
              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
              Super, danke!
              [/COLOR]

              Kommentar


              • #8
                Dort läuft ein Microsoft-IIS/7.0 - scheint da aber genauso Probleme zu haben...

                Naja, ich werde mal eine Runde lesen und schauen ob mir noch eine alternative zum Cronjob o.ä. einfällt. So ein Mist.

                Kommentar


                • #9
                  Naja, ich hatte noch eine Alternative genannt: Abarbeitungszustand in der Session speichern, kleine Portionen abarbeiten, Seite ruft sich selbst wieder auf.
                  [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                  Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                  Super, danke!
                  [/COLOR]

                  Kommentar


                  • #10
                    Stimmt! Danke nochmals...
                    Ich werde eine Rückmeldung geben wie ich es gemacht habe.
                    Ich liebe unbezahlte Arbeit.

                    Kommentar


                    • #11
                      Nur mal kurz um diesen Thread ordentlich zu beenden:

                      Um dieses Timeout mit dem Senden eines Kommentares zu verhindern
                      muss der FastCGI Buffer voll sein, sonst sendet der Win32 Server nichts.

                      In unserem Fall steht dieser auf 4kb - also klappt es so:
                      PHP-Code:
                      ob_start();
                      echo 
                      "<!" str_repeat(" ",4096) . ">";
                      ob_flush();
                      flush();
                      ob_end_flush(); 

                      Sieht zwar nicht schön aus - aber es klappt!
                      Zuletzt geändert von Bellringer; 15.04.2011, 13:42.

                      Kommentar

                      Lädt...
                      X