• 08-03-2013, 16:07:22
    #1
    class DB
    {
    private $hostname		= "localhost";
    private $username		= "root";
    private $password		= "****";
    private $connection;
    
    function __construct(){
    if(!$this->connect()){exit("Sunucuya bağlanamadı.");}
    $this->charset();
    } 
    
    private function connect(){
    $this->connection = mysql_connect($this->hostname,$this->username,$this->password);
    if($this->connection){return true;}else{return false;}
    }
    
    public function select_db($database){
    $db=mysql_select_db($database,$this->connection);	
    if($db){return true;}else{die("Veritabanına bağlanamadı");}
    }
    
    
    
    private function charset(){
    header('Content-type: text/html; charset=utf-8');
    mysql_query("SET NAMES UTF8");
    mysql_query("SET character_set_client = 'utf8'");
    mysql_query("SET character_set_results = 'utf8'");
    mysql_query("SET character_set_connection = 'utf8'");	
    }
    
    private function disconnect(){
    if(mysql_close($this->connection)){return true;}else{return false;};	
    }
    
    
    function __destruct(){$this->disconnect();}
    }



    Yukarıdaki gibi bir bağlantı class oluşturdum herangi bir sorunum yok yalnız bir sorum olacak şimdi bir sorgu class'ı yazcagımı varsayalım o sorgu classında sorguyu yaptırdım diyelim ben bu bağlantı clasında mysql_close yapıyorum destruct fonksiyonunda her sorguda bu şekilde baglantı açılıp kapanıyomu yoksa sorgu clasımı bu classın alt classımı yapmam gerekiyoki her sorgudan sonra baglantım kapansın.


    Biraz karmaşık bir soru oldu ama kısaca özetlemek gerekirse her database işleminden sonra baglantıyı sonlandırmak gerekıyo aksi takdirde bu bağlantılar ramde birikiyo gibisinden birkaç makale okudum bunun için stabil bir class yapısı hazırlamaya çalışıyorum bunu nasıl sağlayabilirim ???

    Yardımcı olacak arkadaşlara şimdiden teşekkürler.
  • 08-03-2013, 21:37:40
    #2
    Fikir arayışı devam etmektedir...
  • 08-03-2013, 22:41:41
    #3
    ezsql i öneririm kendisi iyi performans veriyor wp de kullanıyor böylece close yapmana gerek kalmaz
  • 09-03-2013, 01:49:09
    #4
    ya hazır class yapılarını kullanabilirim onda sıkıntı yok yalnız mantık arayışındayım dostum
  • 09-03-2013, 02:22:11
    #5
    en son destruct çalıştırılır. bütün işlemler bitince.
  • 09-03-2013, 10:04:14
    #6
    nekrofil adlı üyeden alıntı: mesajı görüntüle
    Biraz karmaşık bir soru oldu ama kısaca özetlemek gerekirse her database işleminden sonra baglantıyı sonlandırmak gerekıyo aksi takdirde bu bağlantılar ramde birikiyo gibisinden birkaç makale okudum bunun için stabil bir class yapısı hazırlamaya çalışıyorum bunu nasıl sağlayabilirim ???
    Eğer bağlantılarınızı özellikle "persistent" olarak belirlemediyeseniz, "mysql_close" metodunu çağırmak zorunda değilsiniz. PHP, "non-persistent" bağlantıların kapatılma işlemini betik sonlandığında kendisi kontrol ediyor. Ancak bir sınıf hazırlarken "__desctruct" metodu içinde bunu belirtmeniz simetri açısından yararlı. "__destruct" metodu, oluşturduğunuz nesne yok edildiğinde çağrılır. Eğer siz oluşturduğunuz nesneyi ve atıflarını "özellikle" yok etmezseniz, "__destruct" metodu betiğin sonunda PHP tarafından çağrılır.

    Yazıdığınız sınıflardan oluşturacağınız nesneleri kullansanız da, mysql bağlantısı her sorgunuz için açılıp kapanmaz ya da hafızada bu nedenden dolayı herhangi bir birikme olmaz. Fakat açtığınız bağlantıyı kapatırsanız ve yeniden bir bağlantı oluşturursanız doğal olarak kapanıp açılır. Yazdığınız kodu test etmek isterseniz;

    class DB
    {
    ...
      function get_connection()
      {
        return $this->connection;
      }
    ...
    }
    
    $db1 = new DB();
    $db1->select_db("test");
    var_dump(mysql_fetch_assoc(mysql_query("SHOW PROCESSLIST", $db1->get_connection())));
    
    $db2 = new DB();
    $db2->select_db("test");
    var_dump(mysql_fetch_assoc(mysql_query("SHOW PROCESSLIST", $db2->get_connection())));
    Yukarıdaki iki sorgunun da aynı bağlantıyı kullandığını 'id' ve 'port' numaralarının aynı olmalarından anlayabilirsiniz. İşlemlerinizi gerçekleştirdikten sonra mysql bağlantısını ayrıca kapatmanız şart değil. PHP'de mysql bağlantıları PHP tarafından kontrol edildiği için, yaptığınız işlem, sınıfları kullanmadan, sayfanın başında bir mysql bağlantısı oluşturup satır satır kodları yazmanız ile aynı mantıkta çalışıyor. Bu tür kodlamada mysql bağlantılarını kapatmanıza gerek olmadığı gibi burada da yok. Ancak her yeni nesne oluşturmanız arda arda "mysql_connect" metodlarının çağırılmasına neden oluyor. Fakat PHP bu çağrılar için yeni bağlantılar açmıyor ve mevcut olan bağlantıyı kullanıyor.

    class DB
    {
    ...
      function get_connection()
      {
        return $this->connection;
      }
    ...
    }
    
    $db1 = new DB();
    $db1->select_db("test");
    var_dump(mysql_fetch_assoc(mysql_query("SHOW PROCESSLIST", $db1->get_connection())));
    unset($db1);
    
    $db2 = new DB();
    $db2->select_db("test");
    var_dump(mysql_fetch_assoc(mysql_query("SHOW PROCESSLIST", $db2->get_connection())));
    Yukarıdaki ilk nesne ise "unset" metodu ile yok edildiğinde, "__desctruct" metodu çağrılacağı için mysql bağlantısı kapanıyor ve yeni nesne kendisi için farklı bir bağlantı açılıyor. Birbirinden farklı iki bağlantı açtığınız için her iki bağlantının id çıktıları farklı oluyor.

    Kısacası oluşturduğunuz nesneleri yok etmediğiniz sürece, kuşkulandığınız konular için endişelenmenize gerek yok. Lâkin başka bir açıdan baktığınızda, tek bir bağlantıya sahip iken, aynı bağlantıyı kullanacak olan farklı nesneler oluşturmak ya da oluşturulabilme ihtimalinin olması mantıklı değil. Bu yüzden; "singleton" deseni ile, oluşturacağınız tek bir nesneye, yeni DB bir nesnesi oluşturabileceğiniz her noktadan, yeni nesneler oluşturmadan da ulaşabilirsiniz. Böylece merkezi bir kontrole sahip olursunuz, gereksiz nesnelerin oluşturulmasını/oluşturulabilmesini ve ard arda yapılabilecek "mysql_connect" çağrılarını engellersiniz.

    class DB
    {
      private static $_instance = NULL;
      private $_hostname = 'localhost';
      private $_username = 'root';
      private $_password = '';
      private $_connection;
    
      public static function get_instance()
      {
        if(is_null(DB::$_instance))
          DB::$_instance = new DB();
    
        return DB::$_instance;
      }
    
      private function __construct()
      {
        $this->_init_connection();
        $this->_init_charset();
      }
    
      private function _init_connection()
      {
        if(!$this->_connection = mysql_connect($this->_hostname, $this->_username, $this->_password))
          throw new Exception("{$this->_hostname} üzerinde bağlantı kurulamadı.");
      }
    
      private function _init_charset()
      {
        header('Content-type: text/html; charset=utf-8');
        mysql_query("SET NAMES UTF8");
        mysql_query("SET character_set_client = 'utf8'");
        mysql_query("SET character_set_results = 'utf8'");
        mysql_query("SET character_set_connection = 'utf8'");
      }
    
      public function select_db($database)
      {
        if(!mysql_select_db($database, $this->_connection))
          throw new Exception("Veritabanına bağlanamadı");
      }
    
      public function query($query_string)
      {
        echo "{$query_string} <br />";
      }
    
      public function __destruct()
      {
        mysql_close();
      }
    
      private function __clone() { }
    }
    DB::get_instance()->select_db("test");
    DB::get_instance()->query("q1");
    DB::get_instance()->query("q2");
  • 09-03-2013, 12:19:20
    #7
    Hocam öncelikle verdiğin engin bilgiler için çok teşekkür ediyorum bu denli açıklayıcı olmanda cabası .


    Bir nesne sonlandırılmadığı sürece __destruct fonksiyonu çalışmıyo taki php kendi sonlandırana kadar doğru anlamışım sanırım ve her sorgudan sonra bu mantıkla mysql_close yapmama gerek kalmıyo sanırım yani

    
    class DB 
    { 
    ... 
      function get_connection() 
      { 
        return $this->connection; 
      } 
    ... 
    } 
    
    $db1 = new DB(); 
    $db1->select_db("test"); 
    var_dump(mysql_fetch_assoc(mysql_query("SHOW PROCESSLIST", $db1->get_connection()))); 
    mysql_close();
    
    
    $db2 = new DB(); 
    $db2->select_db("test"); 
    var_dump(mysql_fetch_assoc(mysql_query("SHOW PROCESSLIST", $db2->get_connection())));  
    
    mysql_close();

    Bu şekilde baglantıları her sorgudan sonra kapatmama gerek kalmıyo.

    Bunun sebebi betik sonunda yani __destruct fonksiyonun calışmasımı yoksa php acık baglantıyı bir süre sonra kendi yok ediyo bumudur?






    Tekrar teşekkürü bir borç biliyorum .Klavyen zeval görmesin

    --R10.NET; Flood Engellendi -->-> Yeni yazılan mesaj 12:19:20 -->-> Daha önceki mesaj 12:00:27 --

    class DB
    {
      private static $_instance = NULL;
      private $_hostname = 'localhost';
      private $_username = 'root';
      private $_password = '';
      private $_connection;
    
      public static function get_instance()
      {
        if(is_null(DB::$_instance))
          DB::$_instance = new DB();
    
        return DB::$_instance;
      }
    
      private function __construct()
      {
        $this->_init_connection();
        $this->_init_charset();
      }
    
      private function _init_connection()
      {
        if(!$this->_connection = mysql_connect($this->_hostname, $this->_username, $this->_password))
          throw new Exception("{$this->_hostname} üzerinde bağlantı kurulamadı.");
      }
    
      private function _init_charset()
      {
        header('Content-type: text/html; charset=utf-8');
        mysql_query("SET NAMES UTF8");
        mysql_query("SET character_set_client = 'utf8'");
        mysql_query("SET character_set_results = 'utf8'");
        mysql_query("SET character_set_connection = 'utf8'");
      }
    
      public function select_db($database)
      {
        if(!mysql_select_db($database, $this->_connection))
          throw new Exception("Veritabanına bağlanamadı");
      }
    
      public function query($query_string)
      {
        echo "{$query_string} <br />";
      }
    
      public function __destruct()
      {
        mysql_close();
      }
    
      private function __clone() { }
    }

    Ve son olarak getinstance() fonksiyonun işlevi nedir çok olmayacaksam
  • 09-03-2013, 18:43:41
    #8
    nekrofil adlı üyeden alıntı: mesajı görüntüle
    Bu şekilde baglantıları her sorgudan sonra kapatmama gerek kalmıyo.

    Bunun sebebi betik sonunda yani __destruct fonksiyonun calışmasımı yoksa php acık baglantıyı bir süre sonra kendi yok ediyo bumudur?
    Bağlantıyı kapatmanıza gerek kalmamasının nedeni; PHP'nin betik sonunda bağlantıyı kendisi kapatacak olması ve betiğin çalıştırıldığı sürece, oluşturduğunuz tek bir bağlantı üzerinden çalışması. Diğer bir değiş ile; "__destruct" metodundaki "mysql_close" fonksiyonunun çağrılmasından dolayı değil, daha doğrusu bu metodun çağrılmasına gerek kalmaması. Resme daha büyük bir açıdan bakmak gerekirse; sunucuza bir istek geldiğinde ve isteğe gönderilecek sayfa hazırlanırken bir bağlantı oluşur. Ve sayfanın hazırlanması tamamlandığında bu bağlantı kendiliğinden kapanır.

    nekrofil adlı üyeden alıntı: mesajı görüntüle
    Ve son olarak getinstance() fonksiyonun işlevi nedir
    "singleton patern"; bütün işlemleriniz boyunca bir sınıfın sadece bir kopyasına ihtiyaç duyduğunuzda yararlanabileceğiniz bir tasarım kalıbıdır. Bu uygulamanızda veritabanı sınıfınızın sadece bir örneğine ihtiyaç duyduğunuz için ve "new" metodu ile başka nesnelerin yaratılmasını engelemek isteyeceğiniz için; sınıfınıza "instance" adında statik bir değişken atanır ve sınıfınızın konstrüktörünü "private" olarak belirlenir. Böylece yeni "DB" nesnelerinin yaratılmasının önüne geçersiniz ve bütün uygulama boyunca, "DB" sınıfınızın tek bir nesnesini, sınıfın kendi "instance" değişkenine atayabilrsiniz. Bu değişken statik olduğu için programın her noktasından, sınıfın yeni bir örneğini yaratmaya gerek kalmadan, direkt olarak sınıf üzerinden ulaşılabilir. Bu değişkenin dışarıdan düzenlenmesini engellemek için bu statik değişken de "private" olarak belirlenir ve statik "get_instance" metodu ile bu değişkene ulaşılır. Tabii bir sınıftan nesne yaratmanın tek yolu "new" metodunu kullanmak olmadığı için, "__clone" gibi fonksiyonlar da "private" olarak belirlenir ve çağrılmaları engellenir.