Ankündigung

Einklappen
Keine Ankündigung bisher.

persistente MySQL Verbindung und clonen

Einklappen

Neue Werbung 2019

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

  • persistente MySQL Verbindung und clonen

    Hallo,

    ich habe mir eine kleine MySQL Klasse geschrieben (unten ist ein Teil davon zu sehen) und probiere dabei ein wenig
    die PHP5 MagicFunktions aus unter auch __clone. Meine Klasse soll wenn sie geclont wird automatisch eine neue
    Verbindung mit den alten Verbindungsdaten zur Datenbank aufbauen (siehe Funktion __clone() ). Nur meine Frage
    dazu ist nun inwiefern das bei persisten Verbindungen Sinn macht denn laut Manual:

    vor dem Verbindungsaufbau wird zunächst versucht eine offene (persistente) Verbindung zum gleichen Host,
    mit dem gleichen Benutzernamen und Benutzerkennwort zu finden. Wenn das gelingt, wird die Verbindungskennung
    dieser Verbindung zurückgeliefert anstatt eine neue Verbindung aufzubauen.
    Demnach würde doch das geclonte Objekt mit der gleichen Verbindungskennung wie das Mutterobjekt arbeiten oder?


    PHP-Code:
    <?
    /**     MySQL Class
    *    
    *    @author HStev
    *    @version 1.1
    *    @package Database
    */
    class MySQL
    {
        /**           conndata
        *         
        *            Enthält Connectiondaten
        *         für Clonezwecke
        *         @var array 
        */
        protected     $_conndata            = NULL;
    ...                                                
        /**    connect
        *
        *    verbindet zur Datenbank
        *    @param string $host
        *    @param string $user
        *    @param string $pass
        */
        public function connect($host, $user, $pass)
        {
            if (!isset($this->_persistent))
                throw new MySQLException('set the connection method (persistent=true/false)');
                
            if ($this->_conn)
                throw new MySQLException('already connected');
            
            switch($this->_persistent)
            {
                case true:
                    $this->_conn = @mysql_pconnect ( $host , $user, $pass, $this->flags);
                    break;
                case false:
                    $this->_conn = @mysql_connect ( $host , $user, $pass, true, $this->flags);
                    break;
            }
            
            if (!$this->_conn)
            {            
                if (!$this->_persistent) @mysql_close($this->_conn);
                
                throw new MySQLConException($this->_conn);
            }
            
            $this->_database = NULL;
            
            $this->_conndata = array(    'Host'     => $host,
                                        'User'     => $user,
                                        'Pass'     => $pass
                                    );
        }
    ...          
        public function __clone()
        {
            $this->_resource_orig     = NULL;
            $this->_resource        = NULL;
            $this->_conn            = NULL;
            
            if ($this->_conndata != NULL)
            {
                if (!is_array($this->_conndata))
                    throw new MySQLException("no connectiondata in cloned objekt");
                
                $dbase = $this->database;
                $this->connect($this->_conndata['Host'], $this->_conndata['User'], $this->_conndata['Pass']);
                
                $this->database = $dbase;        
            }
            
        }
    }
    ...
    Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

  • #2
    Re: persistente MySQL Verbindung und clonen

    Zitat von HStev
    Demnach würde doch das geclonte Objekt mit der gleichen Verbindungskennung wie das Mutterobjekt arbeiten oder?
    Das sollte eigentlich der Fall sein. Du könntest aber, um sicher zu gehen, einfach mal var_dump($this->_conn) direkt hinter den Verbindungsaufbau einfügen. Das sollte dir die gleiche MySQL-Resource ausgeben.

    Kommentar


    • #3
      Hmmm das ist eigentlich das was ich durch die clone Mehtode verhindern wollte...

      bin mir nur grad am überlegen ob es trotzdem Sinn macht bei einer persistenten Verbindung mit 2 Objekten zu arbeiten die die gleiche Connectionkennung haben ansonsten könnte die clone Methode ne Exception werfen wenn die Klasse eine Persistente Verbindung hat.
      Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

      Kommentar


      • #4
        Das ist aber der Sinn von pconnect Die Frage ist, was würde sich ändern/es bringen, wenn es ginge trotz pconnect und selben Login-Daten eine neue Verbindung aufzubauen??

        Wozu willst du das denn überhaupt machen?

        Kommentar


        • #5
          Naja der Sinn der hinter der Klasse steckt das andere Objekte im constructor eine Referenz bekommen und dort dann das Object selbst clonen und in eine Klassenvariable schreiben damit jedes Objekt mit einer eigenen Datenbankverbindung arbeitet. Ich wollt dabei die Klasse recht flexible halten und hab mir bei der Möglichkeit persistente Verbindungen zuzulassen nichts weiter bei gedacht.
          Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

          Kommentar


          • #6
            Zunächst einmat hat das mit persisten Verbindungen nichts zu tun, sondern tritt auch auf, wenn mysql_connect() statt mysql_pconnect() verwendet wird. Der Unterschied ist hierbei lediglich, dass die Verbindung bei mysql_connect() nach der Abarbeitung des Scriptes geschlossen wird, während bei der Verwendung von mysql_pconnect() die Verbindung auch danach noch offen gehalten wird. Bei mysql_connect() kann man allerdings seit PHP 4.2.0 als 4. Parameter true angeben, um definitv eine neue Verbindung herzustellen.

            Kommentar


            • #7
              mysql_connect ( [string Server [, string Benutzername [, string Benutzerkennwort [, bool neue_Verbindung [, int client_flags]]]]] )

              guck dir mal meine Connect Function an

              ps: daran hab ich gedacht
              Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

              Kommentar


              • #8
                Zitat von HStev
                ps: daran hab ich gedacht
                Mist, ganz übersehen, dass in deiner Klasse ja durchaus zwischen persistenten und nicht persistenten Verbindungen unterschieden wird.

                Kommentar


                • #9
                  Zitat von HStev
                  [..] damit jedes Objekt mit einer eigenen Datenbankverbindung arbeitet [..]
                  Wozu? Ich benutz singleton für DB-Verbindungen, weil ich gerade das Gegenteil will.

                  Kommentar


                  • #10
                    ja mag ja sein das du das so machst manschmal ist es aber sinnvoll wenn 2 Objekte 2 unterschiedliche Verbindungen benutzen.

                    Ich denke aber ich werd das durch die Exception lösen wenn die Verbindung persistent ist darf das Objekt halt nicht geclont werden.
                    Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

                    Kommentar


                    • #11
                      Du kannst natürlich machen was du willst und wenn du kein Bock hast mit mir drüber zu diskutieren ist das auch ok, aber warum willst du pro Objekt eine Datenbankverbindung aufbauen?

                      Kommentar


                      • #12
                        pro Objekt ist vielleicht etwas übertrieben aber wenn ich zb. 2 Objekte habe die abwechselnd auf die DB zugreifen ist das meiner nach eleganter das über 2 Connections zu lösen vor allen wenn man am Schluss so Informationen braucht wie mysql_insert_id oder mysql_affected_rows klar könnte man das auch zwischenspeichern
                        Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

                        Kommentar


                        • #13
                          Hm ok das könnte ein Argument sein

                          Kommentar


                          • #14
                            Wäre es da nicht einfacher diese Informationen als Eigenschaften des Objektes zu definieren?

                            Kommentar


                            • #15
                              Naja aber die könnte man ausversehen überschreiben
                              Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

                              Kommentar

                              Lädt...
                              X