Torsten: persistenten Verbindungen (MySQL)

Hallo,

lohnt es sich aus Performance Gründen persistenten Verbindungen zu verwenden, in meinem Fall für eine MySQL-Datenbank? Wobei sich die Datenbank auf dem selben Server befindet wo sich auch die php-Dateien befinden!

Jedes mal wenn sich der Inhalt meiner Seite ändert, wird auch eine neue Verbindung zur MySQL-Datenbank hergestellt. Das liegt daran, dass ich meine Inhalte mittels incluce_once() inkludiere(index.php?page=seite_xy.php), und die Datenbankverbindung in der index.php hergestellt wird. Was so viel heißt, wenn der Hyperlink xy betätigt wird, wird auch die index.php neu geladen und somit wird auch eine neue Datenbankverbindung hergestellt.

Lohnt es sich in diesem Fall mittel mysql_pconnect() eine persistente Verbindungen aufzubauen? Wobei ich gelesen habe, dass es bei MySQL-Datenbanken nicht so tragisch wäre wenn die Verbindung ständig neu hergestellt wird, bei anderen wie Oracel z.b. wäre das schon problematischer.

Was könnt ihr mir für meinen Fall empfehlen? persistenten Verbindungen oder nicht-persistenten Verbindungen?

Achso, noch was, wie schließt man eigentlich eine persistenten Verbindung?

Gruß
Torsten

  1. Hi,

    lohnt es sich aus Performance Gründen persistenten Verbindungen zu verwenden, in meinem Fall für eine MySQL-Datenbank? Wobei sich die Datenbank auf dem selben Server befindet wo sich auch die php-Dateien befinden!

    es macht doch keinen Unterschied, ob die Datenbank auf dem selben Server ist, oder?

    Jedes mal wenn sich der Inhalt meiner Seite ändert, wird auch eine neue Verbindung zur MySQL-Datenbank hergestellt. Das liegt daran, dass ich meine Inhalte mittels incluce_once() inkludiere(index.php?page=seite_xy.php), und die Datenbankverbindung in der index.php hergestellt wird. Was so viel heißt, wenn der Hyperlink xy betätigt wird, wird auch die index.php neu geladen und somit wird auch eine neue Datenbankverbindung hergestellt.

    Dann programmiere das (falls notwendig) anders. Wenn die Daten sich nicht ändern, brauchst Du sie auch nicht jedesmal holen.

    Lohnt es sich in diesem Fall mittel mysql_pconnect() eine persistente Verbindungen aufzubauen? Wobei ich gelesen habe, dass es bei MySQL-Datenbanken nicht so tragisch wäre wenn die Verbindung ständig neu hergestellt wird, bei anderen wie Oracel z.b. wäre das schon problematischer.

    Ich glaube nicht, daß es da Unterschiede gibt.
    Wenn Du Dein Auto reparierst und 100mal in den Keller mußt, um Werkzeug usw. zu holen, nervt es Dich spätestens beim 3. Mal, wenn Du den Keller immer wieder abschließt und den Schlüssel suchen mußt.
    Wenn Du aber nicht damit gerechnet hattest, nochmal was holen zu müssen, war das Abschließen in Ordnung...

    Was könnt ihr mir für meinen Fall empfehlen? persistenten Verbindungen oder nicht-persistenten Verbindungen?

    Für eine persistente Verbindung brauchst Du doch sicher ein Programm, was im Hintergrund läuft und Dein eigentliches Programm mit Daten versorgt. Das ist - denke ich - schon aufwändig.
    Bei normalen Webanwendungen macht das keinen Sinn.
    Aber innerhalb eines Scriptes sollte man natürlich nicht bei jeder Abfrage die Verbindung neu aufbauen, denn das kostet sicher enorm Zeit.

    Gruß
    Reiner

    1. Hallo,

      es macht doch keinen Unterschied, ob die Datenbank auf dem selben Server ist, oder?

      Wenn die Datenbank nicht auf derselben Maschine läuft wie der Webserver, dann findet die Kommunikation zwischen Datenbank-Client und Server nicht mehr über schnelle Kommunikationsmethoden wie shared memory oder UNIX Domain Sockets statt, sondern über eine TCP/IP-Verbindung, die eine wesentlich geringere Kapazität und wesentlich höhere Latenzzeiten hat. Dies hat besonders fatale Auswirkungen, wenn die Datenbank und der Webserver durch ein langsames Netzwerk getrennt sind (Umlaufzeiten für Pakete von 10ms und mehr) oder wenn die Netzwerkbandbreite eingeschränkt ist (8 KB/sec und weniger).

      Dann programmiere das (falls notwendig) anders. Wenn die Daten sich nicht ändern, brauchst Du sie auch nicht jedesmal holen.

      und wie? ich weiß es nicht besser!

      Ich glaube nicht, daß es da Unterschiede gibt.
      Wenn Du Dein Auto reparierst und 100mal in den Keller mußt, um Werkzeug usw. zu holen, nervt es Dich spätestens beim 3. Mal, wenn Du den Keller immer wieder abschließt und den Schlüssel suchen mußt.
      Wenn Du aber nicht damit gerechnet hattest, nochmal was holen zu müssen, war das Abschließen in Ordnung...

      Einigen Datenbanken, wie z. B. MySQL, macht es nichts aus, Datenbanklinks zu öffnen und wieder zu schließen. Andere Datenbanken, wie z. B. Oracle, starten bei jedem Connect einen eigenen Clientprozess. Dies ist ein sehr aufwendiger Vorgang.

      Für eine persistente Verbindung brauchst Du doch sicher ein Programm, was im Hintergrund läuft und Dein eigentliches Programm mit Daten versorgt. Das ist - denke ich - schon aufwändig.
      Bei normalen Webanwendungen macht das keinen Sinn.
      Aber innerhalb eines Scriptes sollte man natürlich nicht bei jeder Abfrage die Verbindung neu aufbauen, denn das kostet sicher enorm Zeit.

      für eine persistente Verbindung brauche ich nichts anderes als mysql_pconnect() !

      ist nicht böse gemeint Reiner, aber mir kommst so vor als verstündest du nicht von dem was du da schreibst.

      Gruß
      Torsten

      1. Hi,

        es macht doch keinen Unterschied, ob die Datenbank auf dem selben Server ist, oder?
        Wenn die Datenbank nicht auf derselben Maschine läuft wie der Webserver, dann findet die Kommunikation zwischen Datenbank-Client und Server nicht mehr über schnelle Kommunikationsmethoden wie shared memory oder UNIX Domain Sockets statt, sondern über eine TCP/IP-Verbindung, die eine wesentlich geringere Kapazität und wesentlich höhere Latenzzeiten hat. Dies hat besonders fatale Auswirkungen, wenn die Datenbank und der Webserver durch ein langsames Netzwerk getrennt sind (Umlaufzeiten für Pakete von 10ms und mehr) oder wenn die Netzwerkbandbreite eingeschränkt ist (8 KB/sec und weniger).

        Ich meinte, daß es ja keinen Unterschied macht bzgl. ob man immer wieder neue Verbindungen aufmacht oder nicht in Abhängigkeit von der Maschine. Der Unterschied ist dann höchstens, ob Dir die Verbindung abschmiert, oder?

        Ich glaube nicht, daß es da Unterschiede gibt.
        Wenn Du Dein Auto reparierst und 100mal in den Keller mußt, um Werkzeug usw. zu holen, nervt es Dich spätestens beim 3. Mal, wenn Du den Keller immer wieder abschließt und den Schlüssel suchen mußt.
        Wenn Du aber nicht damit gerechnet hattest, nochmal was holen zu müssen, war das Abschließen in Ordnung...
        Einigen Datenbanken, wie z. B. MySQL, macht es nichts aus, Datenbanklinks zu öffnen und wieder zu schließen. Andere Datenbanken, wie z. B. Oracle, starten bei jedem Connect einen eigenen Clientprozess. Dies ist ein sehr aufwendiger Vorgang.

        Ja, aber ich denke, daß die Grundsätze gleich sind.

        Für eine persistente Verbindung brauchst Du doch sicher ein Programm, was im Hintergrund läuft und Dein eigentliches Programm mit Daten versorgt. Das ist - denke ich - schon aufwändig.
        Bei normalen Webanwendungen macht das keinen Sinn.
        Aber innerhalb eines Scriptes sollte man natürlich nicht bei jeder Abfrage die Verbindung neu aufbauen, denn das kostet sicher enorm Zeit.

        für eine persistente Verbindung brauche ich nichts anderes als mysql_pconnect() !

        ist nicht böse gemeint Reiner, aber mir kommst so vor als verstündest du nicht von dem was du da schreibst.

        Bzgl. Php hast Du Recht. Ich wußte bisher nicht, wie mysql_pconnect funktioniert.

        Gruß
        Reiner

        1. Hi,

          Ich meinte, daß es ja keinen Unterschied macht bzgl. ob man immer wieder neue Verbindungen aufmacht oder nicht in Abhängigkeit von der Maschine. Der Unterschied ist dann höchstens, ob Dir die Verbindung abschmiert, oder?

          ja genau das wollte ich von euch wissen!
          Ist es gut oder schlecht wenn eine MySQL-Datenbank immer wieder geöffnet und geschlossen wird?

          Gruß
          Torsten

          1. Moin!

            Ist es gut oder schlecht wenn eine MySQL-Datenbank immer wieder geöffnet und geschlossen wird?

            Es ist normal.

            Und mysql_pconnect birgt aufgrund der bestehen bleibenden Verbindung das Risiko, dass dein Skript im Problemfall u.U. den MySQL-Server voll mit Verbindungen belegt und ihn damit blockiert. Daher ist von persistenten Verbindungen abzusehen, wenn man nicht weiß, was man tut. Und solch ein Wissen sollte man sich dann doch lieber selbst erarbeiten können, ein schlichter Ratschlag aus einem Forum, einfach pconnect zu nehmen, "weil ist besser", sollte keine Entscheidungsgrundlage sein.

            - Sven Rautenberg

            --
            My sssignature, my preciousssss!
            1. Moin!

              Ist es gut oder schlecht wenn eine MySQL-Datenbank immer wieder geöffnet und geschlossen wird?

              Es ist normal.

              Und als Ergänzung: mysql_pconnect() funktioniert auch nur dann persistent, wenn PHP als Apache-Modul eingebunden ist. Als CGI kann es keine persistenten Verbindungen aufbauen, weil der PHP-Interpreter mit dem Skriptende auch selbst wieder beendet wird.

              Wenn du also Code schreibst, der auf allen Plattformen identisch funktionieren soll, ohne irgendwelche unliebsamen Überraschungen zu erleben, dann verbietet sich mysql_pconnect() schon von selbst.

              Andererseits ist es genau dann einsetzbar, wenn es tatsächlich in einer garantierten Apache-Modul-Umgebung eingesetzt wird und Performancevorteile bringt, weil das Öffnen einer Verbindung zur DB ziemlich lange dauert.

              Ich schätze, bei dem von dir skizzierten Anwendungsszenario dürften die paar Mikrosekunden zur Herstellung der Verbindung kaum ins Gewicht fallen.

              - Sven Rautenberg

              --
              My sssignature, my preciousssss!
              1. Moin!

                Ich schätze, bei dem von dir skizzierten Anwendungsszenario dürften die paar Mikrosekunden zur Herstellung der Verbindung kaum ins Gewicht fallen.

                Als letzte Ergänzung: Die persistente Verbindung wird pro Apache-Childprozess aufgebaut. Typischerweise läuft der Apache mit maximal 150 Childs, in extremeren Hostingsituationen aber durchaus auch mit 255 (maximal konfigurierbare Anzahl ohne Eingriff in den Quelltext) oder noch mehr Childs.

                Das bedeutet, dass dein erster Skriptaufruf mit Sicherheit eine neue DB-Verbindung herstellen muß, jeder weitere Aufruf, der nicht von dem gleichen Apache-Child bearbeitet wird, muß ebenfalls eine neue DB-Verbindung herstellen.

                In einer Share-Hosting-Umgebung (mit PHP-Modul - was zugegeben ungewöhnlich wäre), in der die Zahl der Requests DEINER Website verhältnismäßig gering ist, und die Zahl der Apache-Childs relativ hoch, dürfte es sehr wahrscheinlich sein, dass jeder der Requests deiner Site von einem anderen Apache-Child bearbeitet wird, demnach also trotz mysql_pconnect() jedesmal eine neue DB-Verbindung hergestellt werden muß, die danach dann sinnlos eine gewisse Zeit ungenutzt bleibt, bis ggf. ein Timeout abläuft oder der Apache-Child beendet wird (was bei gewissen Betriebssystemen nach Bearbeitung einer gewissen Anzahl von Requests passiert, und ansonsten auch dann, wenn mehr Childs existieren, als derzeit zur Bearbeitung benötigt werden.

                - Sven Rautenberg

                --
                My sssignature, my preciousssss!
              2. echo $begrüßung;

                Wenn du also Code schreibst, der auf allen Plattformen identisch funktionieren soll, ohne irgendwelche unliebsamen Überraschungen zu erleben, dann verbietet sich mysql_pconnect() schon von selbst.

                Das speziell würde ich nicht als Hinderungsgrund ansehen. Es ist ja nicht so, dass das pconnect dann gar nicht funktioniert.

                Ansonsten stimme ich mit dir in allen anderen Punkten überein.

                echo "$verabschiedung $name";

  2. echo $begrüßung;

    Kennst du dieses Kapitel schon?

    Was könnt ihr mir für meinen Fall empfehlen?

    Hmm, starte eine Messreihe!

    Achso, noch was, wie schließt man eigentlich eine persistenten Verbindung?

    mysql_close() ... tut es nicht. Das Handbuch zu mysql_pconnect() schweigt sich auch darüber aus.

    Die Userkommentare sagen, man solle wait_timeout in MySQL verwenden.

    echo "$verabschiedung $name";

    1. Hallo,

      Kennst du dieses Kapitel schon?

      Ja, deswegen entstand meine Frage.

      Hmm, starte eine Messreihe!

      Noch nie gemacht, wie gehe dabei vor.

      mysql_close() ... tut es nicht. Das Handbuch zu mysql_pconnect() schweigt sich auch darüber aus.

      hmm, dort fand ich nur das mysql_close() die Verbindung nicht schließen kann. Aber wie man sie schließt...

      Die Userkommentare sagen, man solle wait_timeout in MySQL verwenden.

      aha, dass is doch mal was. Danke.

      Ansonsten, ist pconnect zu empfehlen oder sollte man in meinem Fall lieber die Finger davon lassen?

      Gruß
      Torsten

      1. echo $begrüßung;

        Hmm, starte eine Messreihe!
        Noch nie gemacht, wie gehe dabei vor.

        Bau dir ein Szenario mit pconnect und eins mit "normalem" connect. Miss die Zeiten mit microtime() (unter Beachtung des eigenartigen Rückgabeformats bei PHP4).

        Zum Testen würde ich einen SQL-Befehl nehmen, der keine Datenbankabfrage macht, beispielsweise: SELECT 42; Sonst misst du möglicherweise noch unterschiedliche Befehlsabarbeitungszeiten mit.
        Vielleicht reicht es auch, nur die Connect-Zeiten zu messen.

        Ansonsten, ist pconnect zu empfehlen oder sollte man in meinem Fall lieber die Finger davon lassen?

        Ich habe das noch nie verwendet/verwenden können, weil zum einen mein Provider mit CGI läuft und da ist pconnect nicht persistent. Zum anderen sind die Zugriffszahlen zu gering, um damit noch ein Quäntchen Performancegewinn zu rechtfertigen.

        echo "$verabschiedung $name";