Ankündigung

Einklappen
Keine Ankündigung bisher.

Ist db->close notwendig?

Einklappen

Neue Werbung 2019

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

  • Ist db->close notwendig?

    Hi,

    ich habe zu meiner Frage folgenden Thread gefunden:
    http://www.php.de/php-tipps-2009/563...-db-close.html
    Für mich ist leider nicht erkenntlich, was für Vorteile und Nachteile es haben kann, wenn man geöffnet Datenbankconnections mit MySQLi wieder schließt.
    Ist das jetzt nur für die Optik oder geht dabei ggf. etwas flöten, z.B. ein Stück Sicherheit?
    Wo zu ist der Close notwendig?

    LG
    3
    In wenigen, aber manchen Fällen mit viel Speicherbedarf
    66,67%
    2
    Nein
    33,33%
    1

    Die Umfrage ist abgelaufen.


  • #2
    Wies im Fred auch schon steht: Ist unsinnig und braucht dich nicht zu kümmern, da das PHP eh für dich erledigt. Dein Script lebt eh nur diesen einen Request lang.

    Kommentar


    • #3
      In einem typischen PHP-Skript, das in ein paar Sekundenbruchteilen durchgelaufen ist, macht es keinen Unterschied ob die Verbindung nun explizit kurz vor Ablauf oder implizit nach Ablauf geschlossen wird. Es gibt aber eben auch andere Anwendungsfälle, in denen man die Verbindung nicht länger als nötig blockieren möchte.

      Kommentar


      • #4
        Zitat von fab Beitrag anzeigen
        Es gibt aber eben auch andere Anwendungsfälle, in denen man die Verbindung nicht länger als nötig blockieren möchte.
        Könntest du mir ein Beispiel nennen?

        Das heisst, die Sicherheit ist in jedem Fall gewährleistet, unabhängig vo close() oder nicht close()!?

        LG

        Kommentar


        • #5
          Wenn ich schon dabei bin, möchte ich gerne noch eine Frage bezüglich einer Datenbankklasse stellen.
          Ich habe von vielen gehört, dass sie eine Klasse anlegen nur um verschiedene Sachen auszulesen oder Querys zu inserieren.
          Doch im Endeffekt ist eine Datenbankklasse doch doppelt gemoppelt, oder nicht?
          Wenn ich eine Klasse erstelle, diese dann aufrufe mit dem Parameter z.B. "SELECT * from hallo where id=3" und dieser Befehl in der eigenen Datenbankklasse erneut der MySQLi Klasse übergeben wird, rufe ich 2 Klassen auf um einen Befehl auszuführen.
          Unnötig, oder?
          Was sind denn die Vorteile einer solchen Klasse u. ggf. weitere Nachteile?

          Kommentar


          • #6
            "Datenbank-Klassen" die das selbe Interface implementieren wie die Klasse an die sie etwas weiterreichen sind sinnlos ja. Klassen die Klassen benutzen ( sogenannte Adapter, Wrapper oder Decorator ), sind schon Sinnvoll, da dort für das Vorliegende Interface Informationen für das zu benutzende Interface aggregiert werden.

            Kommentar


            • #7
              Mit Sicherheit hat das nichts zu tun. Ein Beispiel wäre ein Export-Skript, das nach dem Auslesen der Datenbank noch weitere zeitaufwändige Operationen wie XML-Generierung durchführen muss, die Datenbank-Verbindung dazu aber nicht mehr benötigt.

              Zu deiner zweiten Frage: Eine wie von dir beschriebene Datenbank-Klasse ist tatsächlich nutzlos wie ein Kropf, einen Vorteil hast du erst, wenn die Klasse dir eine Abstraktion bietet mit der du dir Wiederholungen ersparst. Das kann beliebig komplex werden, wenn dich das Thema interessiert, schlag mal ORM (Object Relational Mapper) nach, prominente Beispiele sind Propel und Doctrine. Da arbeitest du dann gar nicht mehr mit SQL sondern nur noch mit Objekten.

              Eine andere Form von Datenbank-Klassen sind Table-Gateways, die anwendungsspezifische SQL-Queries bündeln, so dass du anders als bei ORM-Frameworks noch immer mit konkretem SQL-Code arbeitest, der vom Rest deiner Anwendung aber verborgen bleibt. Vereinfacht:

              PHP-Code:
              class HalloGateway extends TableGateway
              {
                public function 
              get($id)
                {
                  return 
              $this->query("SELECT * from hallo where id=?"$id);
                }

              Kommentar


              • #8
                Vielen Dank, dein PHP-Beispiel leuchet mir ein, ich werde mich in das Theme ORM mal einlesen und bei fragen auf dich zurück kommen.
                Nun zu meiner ersten Frage.
                Ein Beispiel wäre ein Export-Skript, das nach dem Auslesen der Datenbank noch weitere zeitaufwändige Operationen wie XML-Generierung durchführen muss, die Datenbank-Verbindung dazu aber nicht mehr benötigt.
                Das heisst, wenn ich in einem Script sagen wir mal 5 Abfragen und Inserierungen vornehme, ist es für die Performance positiv, wenn ich nach jeder Abfrage o. Inserierung ein close() an das jeweilige Objekt hänge?

                LG

                Kommentar


                • #9
                  wenn ich nach jeder Abfrage o. Inserierung ein close() an das jeweilige Objekt hänge?
                  nein, sinnvollerweise eben erst dann wenn Du die DB nicht mehr brauchst.

                  z.B. liest Daten aus einer DB ein, verarbeitest sie und schreibst sie in ne andere DB.
                  Dann kannst nach dem Auslesen der ersten DB diese auch wieder schließen.

                  Brauchst sie ja dann nicht mehr.

                  Kommentar


                  • #10
                    Zitat von Koala Beitrag anzeigen
                    nein, sinnvollerweise eben erst dann wenn Du die DB nicht mehr brauchst.

                    z.B. liest Daten aus einer DB ein, verarbeitest sie und schreibst sie in ne andere DB.
                    Dann kannst nach dem Auslesen der ersten DB diese auch wieder schließen.

                    Brauchst sie ja dann nicht mehr.
                    Das leuchtet mir ein, aber nehmen wir dieses Beispiel:
                    PHP-Code:
                    <?php
                     
                    // Neues Datenbank-Objekt erzeugen
                    $db = @new mysqli'localhost''root''''tutorials' );
                    // Pruefen ob die Datenbankverbindung hergestellt werden konnte
                    if (mysqli_connect_errno() == 0)
                    {
                        
                    // Query vorbereiten und an die DB schicken
                        
                    $sql 'SELECT `name`, `bereich` FROM `moderatoren`';
                        
                    $ergebnis $db->query$sql );
                        
                    // Anzahl gefunde Datensaetze ausgeben
                        
                    echo "<p>Es wurden " .$ergebnis->num_rows" Eintr&auml;ge gefunden.</p>";
                        
                    // Ergebnisse ausgeben
                        
                    while ($zeile $ergebnis->fetch_object())
                        {
                            echo 
                    $zeile->name" ist zust&auml;ndig f&uuml;r " .$zeile->bereich"<br />";
                        }
                        
                    // Resourcen freigeben
                        
                    $ergebnis->close();
                    }
                    else
                    {
                        
                    // Es konnte keine Datenbankverbindung aufgebaut werden
                        
                    echo 'Die Datenbank konnte nicht erreicht werden. Folgender Fehler trat auf: <span class="hinweis">' .mysqli_connect_errno(). ' : ' .mysqli_connect_error(). '</span>';
                    }
                    // Datenbankverbindung schliessen
                    $db->close();
                     
                    ?>
                    Ändert es die Performance, wenn ich $ergebnis->close(); weglasse? Eigentlich ist das doch auch falsch, weil ich doch nur die Datenbank-Connection schließen soll und $ergebnis ist ja ein Objekt..

                    Kommentar


                    • #11
                      Mir wäre neu, dass ein mysqli_result-Object eine Funktion close() hat..

                      Kommentar


                      • #12
                        Es schließt eine Datenbank-Verbindung, was nicht impliziert deren Objekte zu zerstören. Schließt du mittendrin in Query-Responses der Datenbank die Verbindung baut das bestehende Objekt die Verbindung wieder auf ( im idealfall ).

                        Und das da oben ist Murks.
                        - Mögliche Fehler unterdrückt man nicht, sondern man wertet sie aus und/oder fängt sie ab. (@)
                        - Nutze UTF-8 Encoding oder Encodings die deine Letter-Ranges decken und liefer HTML-Daten ohne SGML-Notierungen der Sonderzeichen aus, die sind nicht notwendig.

                        Kommentar


                        • #13
                          Mit Sicherheit hat das nichts zu tun. Ein Beispiel wäre ein Export-Skript, das nach dem Auslesen der Datenbank noch weitere zeitaufwändige Operationen wie XML-Generierung durchführen muss, die Datenbank-Verbindung dazu aber nicht mehr benötigt.
                          Seh ich als Ausnahme von der Regel, wobei da die XML-Generierung schon wirklich lange dauern muss. Ansonsten seh ich das Schließen von der DB-Verbindung nur als zusätzliche Fehlerquelle.

                          Was, wenn du 1 Jahr später nach der Generierung der XML die xml auch noch in der DB speichern musst? Dann musst du im getesteten Code rumfummeln, den close wieder wegnehmen und auch erstmal drauf kommen, dass du da zugemacht hast. Wenn die XML-Generierung paar hundert Milisekunden dauert, gewinnste mMn. nix durch das Schließen der Verbindung.

                          Kommentar


                          • #14
                            Zitat von Connar Beitrag anzeigen
                            Mir wäre neu, dass ein mysqli_result-Object eine Funktion close() hat..
                            Hat sie, sie ist nur nicht dokumentiert.

                            Kommentar


                            • #15
                              Zitat von tr0y Beitrag anzeigen
                              Hat sie, sie ist nur nicht dokumentiert.
                              Okay, wieder was gelernt danke.
                              Fehlerhafte Dokumentation ist was tolles *gg*

                              Kommentar

                              Lädt...
                              X