Ankündigung

Einklappen
Keine Ankündigung bisher.

Mysqli Objekte wieder zerstören

Einklappen

Neue Werbung 2019

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

  • Mysqli Objekte wieder zerstören

    Ich öffne ja zuerst die Datenbank wie folgt.

    PHP-Code:
    $mysqli = new mysqli('host''user''pw''db'); 
    Anschließend erzeuge ich mit $mysqli -> prepare($msql_query) ein neues Objekt, das in $stmt gespeichert wird.

    Anschließend erzeuge ich ja wieder ein neues Objekt mit $stmt -> get_result() dieses wird dann in $result gespeichert. Dadurch habe ich bis jetzt 3 Objekte erzeugt. Weiter unten in meinem PHP Code update ich dann Daten in meiner Datenbank. Dadurch erzeuge ich dann wieder 1weiteres Objekt die ich dann wieder in $stmt speicher.

    1. Wird dadurch das alte $stmt Objekte überschrieben?
    2. Wie viele Objekte muss ich jetzt überhaupt zerstören?
    3. Muss ich die Objekte erst zertören bevor ich neue Objekte erzeuge, damit es nicht zu Speicherleichen kommt?
    4. Ist es richtig das ich bei der neuen MYSQLI Klasse kein htmlspecialchars für $_POST['id'] das dies jetzt die Klasse automatisch für mich erledigt?

    PHP-Code:
    $msql_query "SELECT id FROM Testtabelle WHERE id= ? ";
                
    if(
    $stmt $mysqli -> prepare($msql_query))
    {
       
    $stmt -> bind_param("i"$_POST['id']);
       
    $stmt -> execute();
                        
       
    $result $stmt -> get_result();
       
    $anzahl $result -> num_rows;
       
    $row $result -> fetch_assoc();

    weiter unten im PHP Code:

    PHP-Code:
    $msql_query "UPDATE Testtabelle SET id = ? WHERE id = ? ";

    if(
    $stmt $mysqli -> prepare($msql_query))
    {
       
    $stmt -> bind_param("i"$_POST['id']);
       
    $stmt -> execute();


  • #2
    Du erzeugst ein Objekt und rufst aus diesem mehrere Methoden auf. Zerstören musst du gar nichts. Wenn du es explizit "zerstören" willst, (weil z.B. noch viel Nachfolge-Code kommt wo es nicht benötigt wird) einfach die Variable wieder auf NULL setzen.

    Kommentar


    • #3
      Das kann ich nicht ganz glauben , da es ja 3 Klassen gibt.

      MySQLi
      MySQLi_STMT
      MySQLi_Result

      Daher man mehr als 1 Objekt. Diese werden dynamisch im Speicher erzeugt. Sprich wenn 1000 Leute meine Seite besuchen werden 3 Objete erzeugt, wenn ich diese nie zerstöre, dann geht mir sehr schnell der RAM aus und irgenwann schieße ich den Serber ab. Und genau dies möchte ich verhindern.

      Daher habe ich ja oben die 4 Fragen gestellt, auf die ich eine Antwort erhoffe )))

      Mit $mysqli -> close() schließe ich die Verbindung die ich mit $mysqli = new mysqli('host', 'user', 'pw', 'db'); geöffnet habe. Nur ist die Frage ob ich auch die anderen Objekte $stmt und $result zerstören muss.

      Kommentar


      • #4
        Jedes Script hat nur eine Laufzeit von wenigen Millisekunden und danach wird das Objekt sowieso zerstört.

        Kommentar


        • #5
          Zitat von Pimbolie1979 Beitrag anzeigen
          Daher man mehr als 1 Objekt. Diese werden dynamisch im Speicher erzeugt. Sprich wenn 1000 Leute meine Seite besuchen werden 3 Objete erzeugt, wenn ich diese nie zerstöre, dann geht mir sehr schnell der RAM aus und irgenwann schieße ich den Serber ab. Und genau dies möchte ich verhindern.

          Daher habe ich ja oben die 4 Fragen gestellt, auf die ich eine Antwort erhoffe )))
          Beschäftige dich vielleicht noch mal etwas mit den Grundlagen der Informatik. Insbesondere Speicherverwaltung.

          Kommentar


          • #6
            Zitat von dennis81 Beitrag anzeigen
            Beschäftige dich vielleicht noch mal etwas mit den Grundlagen der Informatik. Insbesondere Speicherverwaltung.
            Sehr hilfreich, anstelle das man einfach mal schreibt wo das Problem liegt.

            Kommentar


            • #7
              Es gibt ja nicht umsonst die Funktion $stmt->close() $result -> close() und mysqli->close(); Wenn diese überflüssig sind hätte man diese auch nicht implementieren müssen

              Kommentar


              • #8
                Sehr hilfreich, anstelle das man einfach mal schreibt wo das Problem liegt.
                Diese werden dynamisch im Speicher erzeugt. Sprich wenn 1000 Leute meine Seite besuchen werden 3 Objete erzeugt, wenn ich diese nie zerstöre, dann geht mir sehr schnell der RAM aus
                Dort liegt das Problem.
                Jedes Script hat nur eine Laufzeit von wenigen Millisekunden und danach wird das Objekt sowieso zerstört.

                Kommentar


                • #9
                  Zitat von Pimbolie1979 Beitrag anzeigen
                  Es gibt ja nicht umsonst die Funktion $stmt->close() $result -> close() und mysqli->close(); Wenn diese überflüssig sind hätte man diese auch nicht implementieren müssen
                  Diese Methoden machen nur bei großem Speicherverbrauch Sinn. Bei normalen Scripten, die fünf bis dreißig Querys pro Seitenaufrufe ausführen, benötigt das Parsen und die Ausführung dieser Methoden mehr Ausführungszeit (und blockieren somit indirekt den Speicher länger).

                  Nachdem das Script beendet ist, kümmert PHP sich selber darum, den Speicher wieder zu befreien.

                  Kommentar


                  • #10
                    Übrigens: Jedes prepare verursacht ein neues Objekt, genauso wie jedes Query. Also entstehen mit großer Wahrscheinlichkeit nicht nur drei Objekte.

                    Kommentar


                    • #11
                      Zitat von Asterixus Beitrag anzeigen
                      Diese Methoden machen nur bei großem Speicherverbrauch Sinn. Bei normalen Scripten, die fünf bis dreißig Querys pro Seitenaufrufe ausführen, benötigt das Parsen und die Ausführung dieser Methoden mehr Ausführungszeit (und blockieren somit indirekt den Speicher länger).

                      Nachdem das Script beendet ist, kümmert PHP sich selber darum, den Speicher wieder zu befreien.
                      Vielen Dank für Deine ausführliche Antwort. Wie ist es denn wenn 1000 Leute auf einmal mein Login Script ausführen. Streikt da der Server dann nicht?

                      Kann man sehen wie viel Speicher man gerade verbraucht?
                      Kann man sehen wie lange die Ausführzeit vom Script war?

                      Kommentar


                      • #12
                        Zitat von Asterixus Beitrag anzeigen
                        Übrigens: Jedes prepare verursacht ein neues Objekt, genauso wie jedes Query. Also entstehen mit großer Wahrscheinlichkeit nicht nur drei Objekte.
                        Doch da ich immer $stmt = $mysqli -> prepare($msql_query) durchführe, überschreibe ich ja das alte Objekt.

                        Wenn ich folgendes machen würde

                        $stmt_objekt_1 = $mysqli -> prepare($msql_query);
                        $stmt_objekt_2 = $mysqli -> prepare($msql_query);
                        $stmt_objekt_3 = $mysqli -> prepare($msql_query);

                        dann würde ich mehrere Objekte Erzeugen.


                        IN C WIRD DER SPEICHER NICHT IMMER FREIGEGEBEN. Daher erzeugt man doch eine Klasse, da der Destruktor dann die Free Funktion aufruft und den Speicher freigibt. Ich wuste halt nicht das in PHP dies automatisch geschieht.

                        Kommentar


                        • #13
                          Wie ist es denn wenn 1000 Leute auf einmal mein Login Script ausführen. Streikt da der Server dann nicht?
                          Auf einmal i.S. von „in der selben Mikrosekunde?“ Da greifen dann andere Mechanismen. Z.B. die Konfiguration zur Anzahl gleichzeitiger Verbindungen zum Datenbankserver.

                          IN C WIRD DER SPEICHER NICHT IMMER FREIGEGEBEN. Daher erzeugt man doch eine Klasse, da der Destruktor dann die Free Funktion aufruft und den Speicher freigibt. Ich wuste halt nicht das in PHP dies automatisch geschieht.
                          Dafür ist der sog. Garbage collector zuständig. Solches Wissen kann man sich aber auch mal recherchieren.

                          Kommentar


                          • #14
                            die Close()-Methoden sind für die fälle gedacht in der du risiko läufst ans per php.ini gesetzte memory limit zu kommen, ähnlich dem "dateien laden zum downloaden"-problem wo man mit file_get_contents() versucht 2 GB in einen 15 MB-Eimer zu treten, geht nicht, deswegen achtet man auf den speicher und "streamed" die datei zum clienten ( kilobyte weise ).

                            Im Falle von Datenbanken ist es das selbe in Grün, nativ wird der speicher recht effizient belegt, aber man kann durchaus auch das memory limit mit zu großen results oder zu vielen "ungeschlossenen" queries erreichen. Explizit zerstören muss man es nicht, das tut Close() auch nicht. Es wird lediglich die Datenbankverbindung geschlossen ( und der darüber eingehende mysqlnd-speicherverbrauch ), das mySQLi-Objekt bleibt bestehen.

                            Kommentar


                            • #15
                              Zitat von Pimbolie1979 Beitrag anzeigen
                              4. Ist es richtig das ich bei der neuen MYSQLI Klasse kein htmlspecialchars für $_POST['id'] das dies jetzt die Klasse automatisch für mich erledigt?
                              nein. Prepared Statements senden die Daten getrennt vom SQL Query, da braucht nix escaped oder sonstwie behandelt zu werden.

                              Kommentar

                              Lädt...
                              X