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");