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

  • HStev
    hat ein Thema erstellt persistente MySQL Verbindung und clonen.

    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;        
            }
            
        }
    }
    ...

  • HStev
    antwortet
    ich deklariere eh fast alle meine Eingeschaften als protected weil ich zum größtenteil __set und __get verwende weil man darüber schöner Fehler abfangen kann...aus dem Grund haben auch all meine protected Eigenschaften ein underline als 1. Zeichen im Namen

    ich meinte eher von innerhalb wenn du mit Referenzen arbeitest überschreibst du schnell ne Eigenschaft die du eigentlich gar nicht überschreiben wolltes

    Einen Kommentar schreiben:


  • xabbuh
    antwortet
    Definier sie als private. Dan müsstest du schon deine Klasse kaputt programmieren, um die Eigenschaften zu überschreiben.

    Einen Kommentar schreiben:


  • HStev
    antwortet
    Naja aber die könnte man ausversehen überschreiben

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • Zergling-new
    antwortet
    Hm ok das könnte ein Argument sein

    Einen Kommentar schreiben:


  • HStev
    antwortet
    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

    Einen Kommentar schreiben:


  • Zergling-new
    antwortet
    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?

    Einen Kommentar schreiben:


  • HStev
    antwortet
    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.

    Einen Kommentar schreiben:


  • Zergling-new
    antwortet
    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.

    Einen Kommentar schreiben:


  • xabbuh
    antwortet
    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.

    Einen Kommentar schreiben:


  • HStev
    antwortet
    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

    Einen Kommentar schreiben:


  • xabbuh
    antwortet
    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.

    Einen Kommentar schreiben:


  • HStev
    antwortet
    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.

    Einen Kommentar schreiben:


  • Zergling-new
    antwortet
    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?

    Einen Kommentar schreiben:

Lädt...
X