Skriptabbruch durch Client / Transaktionen / Fragen

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

  • Skriptabbruch durch Client / Transaktionen / Fragen

    Hallo zusammen,

    ich hab ein kleines Problemchen ...

    Ich habe eine kleine PHP-Seite geschrieben, in dessen Skript im chronologischen Ablauf folgendes passiert:

    1. Ein wenig HTML-Code wird per echo ausgegeben u.A. ein Menü mit Links
    2. Ein neuer Datensatz wird in die Datenbank eingefügt
    3. Eine kleine Bestätigung wird per echo ausgegeben + Zeit
    4. Ein groeßerer Algorithmus holt zunächst reichlich Daten aus der DB der Skript verarbeitet diese weiter (relativ umfangreich)
    5. Zahlreiche Datensätze werden in der DB upgedated
    6. Eine kleine Bestätigung wird per echo ausgegeben + Zeit
    7. Die restlliche HTML-Seite wird per echo erzeugt

    Mein Problem nun:
    Da der DB-Server von Puretec etc. manchmal unsäglich langsam ist, enstehen manchmal zwischen Schritt 3 und 6 wartezeiten von bis zu 10 Sekunden, allerdings wird der Skript ordentlich durchgeführt.
    (Die Zeit liegt definitiv nicht an meinem Skript )
    Gut ... die Wartezeiten sind ja mein Problem bzw. Puretecs ...

    Nun kommt das AABER ...
    Während ich nun zwischen Schritt 3 und Schritt 6 auf die Restseite warte (die Kontrollausgabe von Schrott 3 wird schon angezeigt, sonst noch nichts) kann ich ja munter oben auf die Menüpunkte klicken ...
    Beeile ich mich beim klicken ein wenig, so findet das Update der Datensätze (5) nicht mehr statt, welche aber immens wichtig sind und in Verbindung mit dem Insert aus 2 stehen.

    Fragen:

    a)
    Ich hatte bislang gedacht, dass ein PHP-Skript erst vollständig durchgeführt wird und dann erst die HTML-Seite an den Browser gesendet wird. Die scheint in meinem Fall zumindest nicht so zu sein. Wird die Ausgabe wirklich während der ausführung schon erzeugt??

    b)
    Wenn die Ausgabe tatsächlich schon beim Client ankommt, während der Skript noch läuft, wird die durchführung des Skripts unterbrochen, wenn der Client die Seite vor fertigstellung des Skripts wechselt!?

    c)
    In allen gängigen Programmiersprachen habe ich die möglichkeit DBTransaktionen mit Rollbacks zu schreiben. Weiss jemand ob die Standard-MySQL-Installation von Puretec (MySQL 4.0) Transaktionen unterstützt.

    d)
    Falls bei c) JA und bei a) JA. So wäre mir selbst mit Transaktionen nicht geholfen, wenn das Skriptende ja nie erreich würde (wo ggf. der Rollback stände). Es sei denn es gäbe nach einem Transaktionsbeginn und KEINEM commit wegen Skriptabbruch ein Autorollback. Weiss da jemand mehr?


    Dank euch im Vorraus ...
    Sry, falls ich irgendetwas nicht wirklich verstanden haben sollte ^^ hab auch schon gegooglet und gesucht wie ein Affe ...
    Vielleicht kann mir hier jemand helfen.

    Gruß

    Christian

  • #2
    Re: Skriptabbruch durch Client / Transaktionen / Fragen

    http://www.php.net/manual/de/feature...n-handling.php
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Re: Skriptabbruch durch Client / Transaktionen / Fragen

      Hallo Christian,

      Original geschrieben von Mani2000
      a)
      Ich hatte bislang gedacht, dass ein PHP-Skript erst vollständig durchgeführt wird und dann erst die HTML-Seite an den Browser gesendet wird. Die scheint in meinem Fall zumindest nicht so zu sein. Wird die Ausgabe wirklich während der ausführung schon erzeugt??
      Ja, die Ausgabe wird schon während der Ausführung erzeugt. Daraus resultieren auch so fehler wie "headers already sent by..", die du sicherlich kennst. Ein Mittel ist hierfür Outputbuffering, siehe z.B. ob_start

      Original geschrieben von Mani2000
      b)
      Wenn die Ausgabe tatsächlich schon beim Client ankommt, während der Skript noch läuft, wird die durchführung des Skripts unterbrochen, wenn der Client die Seite vor fertigstellung des Skripts wechselt!?
      Standardmäßig wird abgebrochen, ja. Aber du kannst dir ja mal folgendes ansehen:

      ignore_user_abort
      sowie insbesondere zum Verständnis:

      Verbindungssteuerung in PHP

      ob register_shutdown_function für dich interessant ist, glaube ich nicht. Ich würde eher auf ignore_user_abort() setzen.

      Original geschrieben von Mani2000
      c)
      In allen gängigen Programmiersprachen habe ich die möglichkeit DBTransaktionen mit Rollbacks zu schreiben. Weiss jemand ob die Standard-MySQL-Installation von Puretec (MySQL 4.0) Transaktionen unterstützt.
      Also mit PureTec kenne ich mich nicht aus, allerdings unterstütz der Standardtabellentyp MyISAM keine Transaktionen. Dafür musst du z.B. den Tabellentypen "InnoDB" wählen. Der kann das. (Ist dafür aber auch langsamer)

      Original geschrieben von Mani2000
      d)
      Falls bei c) JA und bei a) JA. So wäre mir selbst mit Transaktionen nicht geholfen, wenn das Skriptende ja nie erreich würde (wo ggf. der Rollback stände). Es sei denn es gäbe nach einem Transaktionsbeginn und KEINEM commit wegen Skriptabbruch ein Autorollback. Weiss da jemand mehr?
      Vielleicht hilft dir das: http://dev.mysql.com/doc/refman/5.0/...utocommit.html



      Ich hoffe die Antworten helfen dir.

      Liebe Grüße
      Christian
      Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
      var_dump(), print_r(), debug_backtrace und echo.
      Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
      Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
      Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

      Kommentar


      • #4
        Danke euch schonmal vielmals!

        ob_start löst zumindest schonmal teilweise mein Problem ...

        ignore_user_abort() funktioniert aber auf den Puretec-Servern nicht ...

        Hab mit phpinfo() inner php.ini nachgeguckt ... dort stehts auf OFF ...

        Riesen Ding ... was soll ich nun tun ...
        Scheinbar kann ich bei Puretec definitiv nicht verhindert, dass der Client den Skript abbricht, was aber doch eine extrem wichtige Sache ist.

        Zudem scheint die MySQL Version auf den Puretec Server ebenfalls keine Transaktionen mit Autorollback zu unterstützen ...

        relativ ratlos atm ...

        Aber in jedem Fall Vielen Dank für die ausführlichen und netten Antworten und die damit verbundene Mühe.

        Gruß

        Christian

        PS: Nun geh ich Puretec aufn Nerv

        Kommentar


        • #5
          Original geschrieben von Mani2000
          ignore_user_abort() funktioniert aber auf den Puretec-Servern nicht ...

          Hab mit phpinfo() inner php.ini nachgeguckt ... dort stehts auf OFF ...
          Was hat der vorgegebene Wert einer Konfigurationseinstellung damit zu tun, ob eine zum Setzen dieser verfügbare Funktion "funktioniert"?
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            Gute Frage ...
            kenn ich mich nicht wirklich mit aus ...
            sag du es mir ..

            Auf jeden Fall kann ich ... obwohl ich zu beginn des scripts schreibe
            ignore_user_abort(1) oder ignore_user_abort(TRUE)

            immer noch durch geschickte Manöver den Skript nicht vollständig durchführen lassen ...

            Habe aber gerade bei Puretec angerufen, die mir daraufhin sagten, dass ich selbst eine eigene php.ini hochladen könne ... diese müsse allerdings in jeden Ordner kopiert werden (was auch funktioniert, da ich eine unfug-php.ini reinkopiert habe und jetzt nix mehr geht ) ...

            Ich sag bescheid falls das klappt.

            Kommentar


            • #7
              Jau ... genau daran lags ...

              hab gerade eine neue PHP.ini hochgeladen ...
              die der des puretec-Standards gleicht nur in der Zeile
              ignore_user_abort = on gesetzt.

              Dann in meinem Script zu Beginn
              ignore_user_abort();
              geschrieben ...

              Und siehe da ...
              der Skript läuft im Hintergrund weiter .. auch wenn der Client die Seite vor Scriptende wechselt ...

              ob_start() kann ich mir somit schenken. Ist ja ganz nett wenn angezeigt wird, wie weit der Script gerade ist.

              Besten Dank für euren Support

              Gruß

              Christian

              Kommentar

              Lädt...
              X