Stefan: MySQL-Verbindung nach Query schließen?

Hallo,

erstmal war ich mir nicht sicher ob meine Frage eher zur Rubrik Datenbanken oder zur Rubrik PHP gehört. Da es aber im speziellen um PHP geht, versuche ich mal hier mein Glück. Ich versuche mal mein Problem erläutern:

Ich habe ein PHP-Script das nicht als Website agiert, sondern vielmehr als Cronjob auf einem Linux-System. In diesem Script verwende ich an verschiedenen stellen MySQL-Queries, entweder um Informationen zu Speicher oder Informationen zu bekommen. Zwischen den MySQL-Queries führe ich aber FTP-Prozesse aus die teilweise recht lange dauern können. Nun zu meineer eigentlichen Frage:

a) Ist es besser am Anfang des Scripts einmalig eine MYSQL-Verbindung aufzubauen auch wenn zwischen den einzelnen Queries Minuten oder mal übertrieben gesagt Stunden (es sind keine Stunden, ist nur ein Beispiel um mein Problem zu verdeutlichen) vergehen können. Kann es passieren das es dann zu 'MySQL-Server has gone away' Fehlern kommt?

b) Ist es besser nach jeder MySQL-Query die Datenbank-Verbindung zu schließen und beim nächsten Request neu zu öffnen? Aber wie verhindere ich dann ein unübersichtliches Script durch ständiges öffnen und schließen der Datenbank-Verbindung?

Ich würde mich über eine Antwort sehr freuen.

gruß
Stefan

  1. Tach!

    a) Ist es besser am Anfang des Scripts einmalig eine MYSQL-Verbindung aufzubauen auch wenn zwischen den einzelnen Queries Minuten oder mal übertrieben gesagt Stunden (es sind keine Stunden, ist nur ein Beispiel um mein Problem zu verdeutlichen) vergehen können. Kann es passieren das es dann zu 'MySQL-Server has gone away' Fehlern kommt?

    Um diese Frage zu beantworten, muss man den zuständigen Timeout-Wert finden, und das ist wait_timeout. Bei der Suche nach "mysql connection timeout" kam als eine der Antworten: http://dev.mysql.com/doc/refman/5.0/en/gone-away.html, mit einem Verweis auf ebendiesen Parameter.

    b) Ist es besser nach jeder MySQL-Query die Datenbank-Verbindung zu schließen und beim nächsten Request neu zu öffnen? Aber wie verhindere ich dann ein unübersichtliches Script durch ständiges öffnen und schließen der Datenbank-Verbindung?

    Hinzu kommt noch die Fehlerbehandlung. Und wie das immer so ist mit ständig wiederkehrendem Code: man versucht ihn unter Berücksichtigung der geforderten Funktionalität so generisch wie möglich zu schreiben und lagert ihn in eine Funktion aus.

    dedlfix.

    1. a) Ist es besser am Anfang des Scripts einmalig eine MYSQL-Verbindung aufzubauen auch wenn zwischen den einzelnen Queries Minuten oder mal übertrieben gesagt Stunden (es sind keine Stunden, ist nur ein Beispiel um mein Problem zu verdeutlichen) vergehen können. Kann es passieren das es dann zu 'MySQL-Server has gone away' Fehlern kommt?

      Du hast also ein Script, das Minuten und Stunden lang läuft? In dem Fall rate ich dir dazu, die Verbindung offen zu lassen, aber trotzdem vor dem Query zu prüfen, ob die Verbindung noch existiert. Wenn nicht, wird sie eben neu geöffnet.

      Was mich aber interessiert, was sind das für Scripts, die solange laufen? Wenn ich Programme brauche, die solche Laufzeiten haben, schreib ich die eher in C oder C++.

      1. Das sollte eine Antwort auf den OP werden, nicht auf dedlfix;)

      2. Tach!

        Du hast also ein Script, das Minuten und Stunden lang läuft? In dem Fall rate ich dir dazu, die Verbindung offen zu lassen, aber trotzdem vor dem Query zu prüfen, ob die Verbindung noch existiert. Wenn nicht, wird sie eben neu geöffnet.

        Sogar PHP hat mysql_ping() imeplementiert. Bin beeindruckt.

        Was mich aber interessiert, was sind das für Scripts, die solange laufen? Wenn ich Programme brauche, die solche Laufzeiten haben, schreib ich die eher in C oder C++.

        Was prädestiniert C oder C++ gegenüber PHP oder anderen Script-Sprachen?

        dedlfix.

        1. Was prädestiniert C oder C++ gegenüber PHP oder anderen Script-Sprachen?

          Persönlicher Geschmack. Ich find eine Scriptsprache auf Systemebene für solche Laufzeiten einfach Pfui. Selbst Perl halte ich dafür für die zweite Wahl. Wie gesagt, das ist nur rein subjektiv.

        2. Sogar PHP hat mysql_ping() imeplementiert. Bin beeindruckt.

          Hallo,

          die Lösung mit mysql_ping gefällt mir, dass muss ich überlesen haben, als ich mir die Funktionsliste von MySQL durchgelesen habe. Danke für den hilfreichen Tipp!

          gruß
          Stefan

        3. Was prädestiniert C oder C++ gegenüber PHP oder anderen Script-Sprachen?

          Geschwindigkeit. Was logisch ist, schliesslich muss ja die Skriptsprache zur Laufzeit noch interpretiert werden. Mit PHP direkt habe ich jetzt keine Erfahrungswerte, aber beispielsweise zwischen C und Bash kann der Unterschied eklatant sein und je nach Prozessor deutlich spürbar.

          Gruß
          Stefanie

          1. aber beispielsweise zwischen C und Bash kann der Unterschied eklatant sein und je nach Prozessor deutlich spürbar.

            Und wenn der Programmierer nichts kann, ist C oder C++ noch langsamer als alles andere.

            Desweiteren gibt es zig Anwendungen, in denen die Bash um ein vielfaches schneller ist als ein Programm in C oder C++ geschrieben, grad wenn es um den Aufruf externer Programme geht.

            Grundsätzlich lässt sich die Ausführungsgeschwindigkeit nicht pauschalisieren. Es kommt _immer_ auf den Anwendungsfall und das Können des Programmierers an.

            Dabei nehme ich Java aus, das braucht die Welt gar nicht, das ist aber wieder meine persönliche Abneigung und viele andere werden es sicher anders sehen (was auch Sinn macht) *g*

          2. Tach!

            Was prädestiniert C oder C++ gegenüber PHP oder anderen Script-Sprachen?
            Geschwindigkeit. Was logisch ist, schliesslich muss ja die Skriptsprache zur Laufzeit noch interpretiert werden. Mit PHP direkt habe ich jetzt keine Erfahrungswerte, aber beispielsweise zwischen C und Bash kann der Unterschied eklatant sein und je nach Prozessor deutlich spürbar.

            Wenn es um rechenintensive Dinge geht, ist Geschwindigkeit relevant. Bei einem bisschen Datenverarbeitung fällt das aber oftmals nicht ins Gewicht. Im Falle des OPs wird die Wartezeit durch das Netzwerk der größte Brocken sein und der Rest vernachlässigbar klein. Geschwindigkeit ist also kein in jedem Fall schlagendes Argument, auch nicht bei langen Laufzeiten. Man muss wie immer genau hinschauen, ob in einem Fall die Vorteile von PHP mehr sind als die von C/C++ oder umgekehrt.

            dedlfix.