Sebastian Becker: Timeout beim Abarbeiten eines Skripts

Hallo,

der Begriff "Timeout" ist vielleicht nicht ganz richtig, denn es geht um folgendes Problem:

Ich erzeuge aus einem Excel-File auf dem Server eine HTML-Seite sowie ein PDF mit einer Speisekarte. Normalerweise funktioniert das auch mit guter Performance.

Aus unerfindlichen Gründen dauert das Parsen des Excel-Files aber hin und wieder so lange (ca. 1-2 Minuten), daß selbst der geduldigste Besucher die entsprechende Seite bis dahin vermutlich schon längst verlassen hat.

Da nach Angaben des Serverbetreibers "all-inkl" keine besonders hohe Auslastung des Servers vorliegt, weiß ich Moment auch keine überzeugende ursächliche Lösung für das Problem.

Immerhin möchte ich zumindest eine Fehlermeldung ausgeben, oder aber den Inhalt des Excel-Files in einem einfacher und schneller zu parsenden Format (CSV oder Datenbank) cachen. Dazu nüsste ich aber wissen, ob sich der Parser mal wieder "aufgehängt" hat, d.h. daß eine bestimmte Bearbeitungszeit (z.B. 1 sec.) ohne Ergebnis, d.h. erzeugtes Array, verstrichen ist, um die Daten dann aus dem CSV-File oder der Datenbank zu holen.

Wie kann ich diese Zeitüberschreitung feststellen?

Danke für alle Hinweise, auch zu dem generellen Problem,

Grüße aus Berlin,

Sebastian Becker

  1. Hallo,

    willst Du nun auf eine Zeitüberschreitung oder auf ein "Aufhängen" reagieren? Das sind immerhin zwei verschiedene Schuhe.

    Darfst Du exec() benutzen?

    Dann könntest Du den Job auch in den Hintergrund stellen.
    Schau Dir mal an, wie die das bei http://bahn.de und dem persönlichen Fahrplan gemacht haben. Das dürfte Deinem Problem entsprechen.

    LG
    Chris

    1. Hallo,

      willst Du nun auf eine Zeitüberschreitung oder auf ein "Aufhängen" reagieren? Das sind immerhin zwei verschiedene Schuhe.

      Das "Aufhängen" habe ich in Anführungszeichen gesetzt, weil ich damit eine unverhältnismäßig lange Bearbeitungsdauer meine.

      Darfst Du exec() benutzen?
      Dann könntest Du den Job auch in den Hintergrund stellen.

      Ich weiß zwar nicht, wie das geht, vermute aber mal, daß exec() bei dem geshareten Server deaktiviert ist und will das Skript auch portabel halten - daher scheidet diese Möglichkeit aus.

      Schau Dir mal an, wie die das bei http://bahn.de und dem persönlichen Fahrplan gemacht haben. Das dürfte Deinem Problem entsprechen.

      Aber in deren Quellcode kann ich auch nicht hereinschauen ...

      Grüße,

      Sebastian

      1. Hallo,

        Darfst Du exec() benutzen?
        Dann könntest Du den Job auch in den Hintergrund stellen.

        Ich weiß zwar nicht, wie das geht, vermute aber mal, daß exec() bei dem geshareten Server deaktiviert ist und will das Skript auch portabel halten - daher scheidet diese Möglichkeit aus.

        Ja, ja die eierlegende Wollmilchsau...

        Schau Dir mal an, wie die das bei http://bahn.de und dem persönlichen Fahrplan gemacht haben. Das dürfte Deinem Problem entsprechen.

        Aber in deren Quellcode kann ich auch nicht hereinschauen ...

        Das musst Du auch nicht. Wenn Dir die Funktionlität gefällt, bekommen wir hier gemeinsam einen geeigneten Quelltext zusammen :-)

        LG
        Chris

        1. Hallo, Chris,

          Schau Dir mal an, wie die das bei http://bahn.de und dem persönlichen Fahrplan gemacht haben. Das dürfte Deinem Problem entsprechen.

          Aber in deren Quellcode kann ich auch nicht hereinschauen ...

          Das musst Du auch nicht. Wenn Dir die Funktionlität gefällt, bekommen wir hier gemeinsam einen geeigneten Quelltext zusammen :-)

          Vielen Dank! Welche Funktionalität meinst Du denn? Bei mir wird in Windeseile eine Fahrplanverbindung angezeigt ...

          Grüße,

          Sebastian

          Ich muß jetzt mal weg und antworte ggf. später am Abend ...

  2. Hallo Sebastian,

    ... schneller zu parsenden Format (CSV oder Datenbank) cachen. Dazu nüsste ich aber wissen, ob sich der Parser mal wieder "aufgehängt" hat, d.h. daß eine bestimmte Bearbeitungszeit (z.B. 1 sec.) ohne Ergebnis, d.h. erzeugtes Array, verstrichen ist, um die Daten dann aus dem CSV-File oder der Datenbank zu holen.

    unabhängig von einer Abzufangenden Fehlermeldung, solltest Du diesen Weg forcieren. Du hättest Die möglichkeite den geparsten Extrakt der Exel-Datei zu serialisieren und in einem weiteren File abzulegen. Die Exel-Datei würde dann vor jedem Paren gegen eine Prüfsumme (md5/sha/...) abgeglichen, um sich das Parsen zu sparen.

    Wie kann ich diese Zeitüberschreitung feststellen?

    Am einfachsten ginge dies natürlich innerhalb einer Schleife (aber auf die Idee bist Du sicher auch gekommen - und vermutlich ergibt sich aus dem Steuerfluß diese Möglichkeit nicht). Anderfalls würde ich mit der Erweiterung PCNTL arbeiten und einen Kindprozess zur Überwachung anlegen - nur wirst Du diese Erweiterung sicher nicht haben.
    Das beste wäre ein Einblick in den Quellcode.

    Gruß aus Berlin!
    eddi

    --
    Wer Rechtschreibfehler findet, darf sie behalten.
    1. Hallo, eddi,

      Die Exel-Datei würde dann vor jedem Paren gegen eine Prüfsumme (md5/sha/...) abgeglichen, um sich das Parsen zu sparen.

      wie meinst Du das denn?

      Wie kann ich diese Zeitüberschreitung feststellen?
      Am einfachsten ginge dies natürlich innerhalb einer Schleife (aber auf die Idee bist Du sicher auch gekommen - und vermutlich ergibt sich aus dem Steuerfluß diese Möglichkeit nicht).

      Das verstehe ich leider auch nicht ganz. Ich hatte gedacht, daß ich einen Timer setze und nach Ablauf gucke, ob ein Array mit einer Mindestzahl von Einträgen erzeugt wurde, weiß aber nicht, wie ich das praktisch realisieren soll ...

      Anderfalls würde ich mit der Erweiterung PCNTL arbeiten und einen Kindprozess zur Überwachung anlegen - nur wirst Du diese Erweiterung sicher nicht haben.

      Prozesskontrollunterstützung ist in PHP nicht standardmäßig aktiviert, daher will ich lieber darauf verzichten.

      Das beste wäre ein Einblick in den Quellcode.

      Der ist recht komplex und den möchte ich auch nicht komplett rausgeben ...

      Grüße aus Berlin-Charlottenburg,

      Sebastian

      1. Re:

        Die Exel-Datei würde dann vor jedem Paren gegen eine Prüfsumme (md5/sha/...) abgeglichen, um sich das Parsen zu sparen.

        wie meinst Du das denn?

        Ein File läßt sich auf Änderungen überprüfen. (md5_file())
        Ist die Prüfsumme gleich, braucht das Dokument nicht erneut geparst zu werden.
        Serialisiere den Extrakt und speichere ihn zum wiederverwerten ab.

        Wie kann ich diese Zeitüberschreitung feststellen?
        Am einfachsten ginge dies natürlich innerhalb einer Schleife (aber auf die Idee bist Du sicher auch gekommen - und vermutlich ergibt sich aus dem Steuerfluß diese Möglichkeit nicht).

        Das verstehe ich leider auch nicht ganz. Ich hatte gedacht, daß ich einen Timer setze und nach Ablauf gucke, ob ein Array mit einer Mindestzahl von Einträgen erzeugt wurde, weiß aber nicht, wie ich das praktisch realisieren soll ...

        Der Timer müßte parallel arbeiten (wie in Threads). PHP unterstütz ein solches Verfahren nur durch unterschiedliche Prozesse (Erweiterung PCNTL).
        Nur innerhalb einer Schleife könnte immer wieder abgefragt werden, "wie spät es ist".

        Anderfalls würde ich mit der Erweiterung PCNTL arbeiten und einen Kindprozess zur Überwachung anlegen - nur wirst Du diese Erweiterung sicher nicht haben.

        Prozesskontrollunterstützung ist in PHP nicht standardmäßig aktiviert, daher will ich lieber darauf verzichten.

        Worauf begründet sich die unterschwellig spührbare Angst? (Es ist nicht als experimentell gekennzeichnet und leistet hervorangede Arbeit!)

        Das beste wäre ein Einblick in den Quellcode.

        Der ist recht komplex und den möchte ich auch nicht komplett rausgeben ...

        Dann hoffe ich, das er zum parsen eine Schleife benutzt. Tickes werden Dir leider nicht weiterhelfen...

        Gruß aus Berlin!
        eddi

        --
        Wer Rechtschreibfehler findet, darf sie behalten.
        1. Hallo, Eddi,

          Die Exel-Datei würde dann vor jedem Paren gegen eine Prüfsumme (md5/sha/...) abgeglichen, um sich das Parsen zu sparen.

          genau so habe ich es gemacht - die Excel-Files müssen dadurch nur noch ganz selten geparst werden, so daß die temporären Performanceabfälle kaum noch ins Gewicht fallen ..

          Danke!  :-)

          Grüße,

          Sebastian

  3. hi,

    Aus unerfindlichen Gründen dauert das Parsen des Excel-Files aber hin und wieder so lange (ca. 1-2 Minuten), daß selbst der geduldigste Besucher die entsprechende Seite bis dahin vermutlich schon längst verlassen hat.

    Erfolgen denn Änderungen so häufig, dass du die Erstellung des PDFs aus den Excel-Daten realtime bei jedem Seitenaufruf durch einen Besucher machen musst ...?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo, wahsaga,

      Erfolgen denn Änderungen so häufig, dass du die Erstellung des PDFs aus den Excel-Daten realtime bei jedem Seitenaufruf durch einen Besucher machen musst ...?

      nicht unbedingt, wobei die Tageskarte natürlich schon relativ häufig wechselt. Allerdings sollte das Parsen eigentlich nicht länger dauern als das Auslesen aus einer Datenbank - soweit die Theorie ...

      Es muß in jedem Falle sichergestellt sein, daß immer dann, wenn das Excel-File geändert wurde, die Änderungen auch in die HTML-Seite bzw. das PDF-File einfließen ...

      Grüße,

      Sebastian

      1. hi,

        Erfolgen denn Änderungen so häufig, dass du die Erstellung des PDFs aus den Excel-Daten realtime bei jedem Seitenaufruf durch einen Besucher machen musst ...?

        nicht unbedingt, wobei die Tageskarte natürlich schon relativ häufig wechselt.

        Gut, sagen wir eine Tageskarte würde, ihrem Namen alle Ehre machend, einmal am Tag aktualisiert.
        Dann ist es doch aber trotzdem recht unperformant, bei _jedem_ Aufruf der Seite durch _jeden einzelnen_ Benutzer die PDF-Datei neu erzeugen zu lassen ...

        Allerdings sollte das Parsen eigentlich nicht länger dauern als das Auslesen aus einer Datenbank - soweit die Theorie ...

        Ich würde in dem Falle die Daten weder jedesmal parsen noch jedesmal anderswo auslesen wollen.

        _Einmal_ das PDF erstellen, wenn die Eingabedaten (Excel-Datei) sich geändert haben, sollte doch vollkommen ausreichen?

        Es muß in jedem Falle sichergestellt sein, daß immer dann, wenn das Excel-File geändert wurde, die Änderungen auch in die HTML-Seite bzw. das PDF-File einfließen ...

        Dann solltest du versuchen, dafür zu sorgen - in dem du dies an den Mechanismus anhängst, der die Exceldatei erzeugt.
        Lädt ein berechtigter Benutzer sie über ein HTTP-Formular hoch? Dann hänge die Erzeugung von PDF und HTML-Dokument an diesen Vorgang an.
        Wenn sie anderswie eintrifft - dann überlege, ob du ein anderes Kriterium als Trigger für das neu-Erzeugen der Folgedokumente finden kannst (oder ändere ggf. die Übertragungsmethode für die Excel-Datei entsprechend).

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hallo, Wahsaga,

          Gut, sagen wir eine Tageskarte würde, ihrem Namen alle Ehre machend, einmal am Tag aktualisiert.
          Dann ist es doch aber trotzdem recht unperformant, bei _jedem_ Aufruf der Seite durch _jeden einzelnen_ Benutzer die PDF-Datei neu erzeugen zu lassen ...
          Ich würde in dem Falle die Daten weder jedesmal parsen noch jedesmal anderswo auslesen wollen.

          Prinzipiell sind diese Überlegungen natürlich richtig - bei der geringen Zahl der täglichen Zugriffe einer Restauranseite sollte die erhöhte Serverlast bzw. der damit theoretisch verbundene Performancverlust aber eigentlich nicht ins Gewicht fallen. Eigentlich, wie gesagt ...

          _Einmal_ das PDF erstellen, wenn die Eingabedaten (Excel-Datei) sich geändert haben, sollte doch vollkommen ausreichen?

          Es muß in jedem Falle sichergestellt sein, daß immer dann, wenn das Excel-File geändert wurde, die Änderungen auch in die HTML-Seite bzw. das PDF-File einfließen ...
          Dann solltest du versuchen, dafür zu sorgen - in dem du dies an den Mechanismus anhängst, der die Exceldatei erzeugt.

          Ich werde versuchen, mir Deine Worte zu Herzen zu nehmen. Prinzipiell wollte ich es auch so machen, aber der Aufwand erschien mir als zu hoch - bis zu den beschriebenen temporären Performanceproblemen ...

          Lädt ein berechtigter Benutzer sie über ein HTTP-Formular hoch? Dann hänge die Erzeugung von PDF und HTML-Dokument an diesen Vorgang

          Das wir ein wenig schwierig - aber ich werde mal sehen, ob es sich machen lässt ...

          Danke für's konstruktive Mitdenken, Grüße,

          Sebastian

          1. Hallo Freunde des gehobenen Forumsgenusses,

            Prinzipiell sind diese Überlegungen natürlich richtig - bei der geringen Zahl der täglichen Zugriffe einer Restauranseite sollte die erhöhte Serverlast bzw. der damit theoretisch verbundene Performancverlust aber eigentlich nicht ins Gewicht fallen.

            Warum einen Algorithmus mit der Laufzeitkomplexität O(n) nehmen, wenn man einen mit der Laufzeitkomplexität O(1) haben kann (n = Anzahl Besucher)? Durch wen wird denn nun wie diese Excel-Datei geändert?

            Gruß
            Alexander Brock