PHPKram: Maximum Execution Time abfangen

Guten Morgen,

Angenommen ich habe ein Script, dass Daten in eine DB einträgt und dabei enorm viel Zeit benötigt - soviel, dass es sogar die Maximum Execution Time (standardmäßig 30Sekunden) überschreitet. Wie kann ich dann verhindern, dass die Daten dann in die Datenbank geschrieben werden? Ich möchte, dass Daten nur dann in die Datenbank geschrieben werden, wenn das Script auch innerhalb der Maximum Execution Time alle Funktionen vernünftig ausführen kann. Kann man
das irgendwie abfangen? Achtung: es handelt sich hier um dutzende Querys. Also viele kleine, einzelne die in die DB geschrieben werden und natürlich nur einen Sinn machen, wenn sie alle erfolgreich eingetragen werden. Es macht keinen Sinn, wenn das Script 50% der Querys erfolgreich ausführen kann, dann der Interpreter abbricht, weil die maximale Zeit überschritten wurde und der Rest der Daten nicht mehr reingeschrieben wird.

Danke.

  1. Seid gegrüßt!

    ein Versuch, auf den ich es ankommen lassen würde: Speichere die Queries als String in einer temporären Datei. Am Ende setzt du einen eindeutigen MySQL-Kommentar. Jetzt prüfst du, ob der Kommentar auftaucht. Wenn dem so ist, führst du über exec einen mysql-Befehl aus. Zum einen dürfte die Laufzeit des per exec ausgeführten Befehls nicht mit in die max-exex-time fallen und zum zweiten bist du somit sicher, dass nur alle oder kein Query ausgeführt werden.

    --
    Bis Später
    RuD
    .................................................................
    Mein Weblog:
    http://blog.rudweb.de/
  2. Tach!

    Ich möchte, dass Daten nur dann in die Datenbank geschrieben werden, wenn das Script auch innerhalb der Maximum Execution Time alle Funktionen vernünftig ausführen kann.

    Dann solltest du eine Transaction auf Seiten der Datenbank verwenden. Geht aber nicht mit MyISAM- aber mit InnoDB-Tabellen.

    dedlfix.

  3. Hello,

    was auf Seiten der Datenbank möglich ist, hat Dedlfix schon geschrieben: Transaktion.

    Die hat aber auch nur Sinn, wenn das PHP-Script nicht abgebrochen wird. Sonst sind nachher lauter unbeendete Transaktionen vorhanden.

    Damit das Script nicht abgebrochen wird, wennn das Browserfenster geschlossen wird, sollte man
    http://de2.php.net/manual/en/function.ignore-user-abort.php
    beachten.

    Außerdem emphielt es sich, das Binary Log der Datenbank zu aktivieren. Aber für die Transaktionsverwaltung benötigt man das mWn sowieso.

    Wenn Statementfolgen zu langsam abgearbeitet werden, kann das auch an der Indizierung liegen. Stelle fest, ob z.B. viele Löschungen stattfinden. Dann könnte man die Ausführung oder auch die Reindexierung zurückstellen.

    siehe http://dev.mysql.com/doc/refman/5.1/de/delete.html

    • Low Priority
    • Delete Quick / Optimize Table

    und es lohnt sich oft, das Datenmodell zu überdenken und einen "Delete-Merker" einzufügen, sodass Löschungen nicht physisch sondern erstmal nur logisch durchgeführt werden. Das spart enorm viel Zeit. Allrdings muss man diese logische Löschart in allen Statements berücksichrtigen.

    Viele Einzelne Statements, die einen logischen Zusammenhang haben, bedürfen außerdem einer intensiven Berücksichtigung konkurrierdender Requests. Anderenfalls ist die Integrität der Datenbank massiv gefährdet.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Tach!

      Die [Transaktion] hat aber auch nur Sinn, wenn das PHP-Script nicht abgebrochen wird. Sonst sind nachher lauter unbeendete Transaktionen vorhanden.

      If a session that has autocommit disabled ends without explicitly committing the final transaction, MySQL rolls back that transaction.

      Damit das Script nicht abgebrochen wird, wennn das Browserfenster geschlossen wird, sollte man
      http://de2.php.net/manual/en/function.ignore-user-abort.php
      beachten.

      Hilft nicht gegen Maximum-Execution-Timeouts.

      Außerdem emphielt es sich, das Binary Log der Datenbank zu aktivieren. Aber für die Transaktionsverwaltung benötigt man das mWn sowieso.

      Das Handbuch sagt dazu was anderes. Das Binary Log braucht man für Replikation und kann zum Wiederherstellen von Daten verwendet werden. Bei Transaktionen wird es erst zu ihrem Commit befüllt (siehe gegen Ende der verlinkten Seite).

      dedlfix.

      1. Hello,

        Hilft nicht gegen Maximum-Execution-Timeouts.

        Das ist klar. Ende ist Ende. Dann greift noch der Exit-Handler und tschüss.
        http://de2.php.net/manual/en/function.register-shutdown-function.php

        Ob man darin aber noch ein Rollback anstoßen kann, habe ich noch nie ausprobiert.

        Außerdem empfiehlt es sich, das Binary Log der Datenbank zu aktivieren. Aber für die Transaktionsverwaltung benötigt man das mWn sowieso.

        Das Handbuch sagt dazu was anderes. Das Binary Log braucht man für Replikation und kann zum Wiederherstellen von Daten verwendet werden. Bei Transaktionen wird es erst zu ihrem Commit befüllt (siehe gegen Ende der verlinkten Seite).

        Dann führt MySQL ein zusätzliches Transaktions-Log?

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Tach!

          [Binary Log nicht für Transaktionen zuständig]
          Dann führt MySQL ein zusätzliches Transaktions-Log?

          Die Verfügbarkeit von Transaktionen ist abhängig von der Storage Engine. Frag die InnoDB(Dokumentation), ob sie ein Log führt. Wenn die InnoDB für ihre Zwecke/Features ein Log benötigt, ist es sicher sinnvoll, wenn sie es selbst führt.

          Um die Frage zu beantworten: Ja, die InnoDB führt ein Log, und es ist nicht das allgemeine Binary Log.

          dedlfix.