PDA

View Full Version : سوال: بستن Mysql Connection



sajadpm
جمعه 04 بهمن 1392, 19:34 عصر
با سلام و خسته نباشید خدمت دوستان گرامی

من از آموزش آقای شهرکی استفاده می کنم و حالا سوالی برام پیش اومده اینکه در این فایل که ما در هر فانکشن به دیتابیس متصل می شیم آیا لازم هست که کانکشن رو ببندیم ؟ به چه صورت می توان کانکشن رو ببندیم ؟

تشکر و سپاس فراوان از شما


class Articles
{
private $host;
private $user;
private $pass;
private $db;

public function Articles()
{
global $host;
global $user;
global $pass;
global $db;
$this->host=$host;
$this->user=$user;
$this->pass=$pass;
$this->db=$db;
}

private function Connect()
{
mysql_connect($this->host,$this->user,$this->pass);
mysql_select_db($this->db);
mysql_query('SET NAMES \'utf8\'');
}

public function SelectAll()
{
$this->Connect();
$result=mysql_query('SELECT * FROM `articles` ORDER BY `id`');
return $result;
}

}

Tarragon
جمعه 04 بهمن 1392, 20:38 عصر
با سلام
اولا الزامی نیست mysql بسته بشه چون با تموم شد اسکریپت خود به خود mysql بسته می شه.
با این حال می شه با کد
mysql_close(); mysql خودتون رو ببندید.

MMSHFE
جمعه 04 بهمن 1392, 21:39 عصر
البته دقت کنید که تعداد اتصالات همزمان به MySQL هم بسته به تنظیمات سرور، محدوده. بنابراین اگه یک اسکریپت پیچیده و طولانی دارین که کلی کار باید انجام بده درحالی که فقط اول اسکریپت به دیتابیس وصل میشه و اطلاعات رو استخراج میکنه و دیگه به دیتابیس کاری نداره، بهتره همونجا که کارتون با دیتابیس تمام میشه، اتصال به MySQL رو ببندین تا درخواستهای همزمان دیگری که وارد میشن، زمانی که اسکریپت شما وارد فرآیند طولانی خودش میشه، با مشکل اتصالهای بیش از حد (Too many connections) مواجه نشه.

sajadpm
جمعه 04 بهمن 1392, 21:44 عصر
تشکر از پاسخ شما ، بر روی سرور وقتی top می گیرم حدود به 15 گیگ رم رو mysql اشغال کرده است که گفتم این راه رو امتحان کنم ببینم حل میشه !

حالا باید کجا کانکشن رو ببندم آیا ؟ قبل از فرستادن نتیجه تابع ؟ مثال :


public function SelectAll() { $this->Connect(); $result=mysql_query('SELECT * FROM `articles` ORDER BY `id`');
mysql_close();
return $result; }

sajadpm
جمعه 04 بهمن 1392, 21:58 عصر
البته دقت کنید که تعداد اتصالات همزمان به MySQL هم بسته به تنظیمات سرور، محدوده. بنابراین اگه یک اسکریپت پیچیده و طولانی دارین که کلی کار باید انجام بده درحالی که فقط اول اسکریپت به دیتابیس وصل میشه و اطلاعات رو استخراج میکنه و دیگه به دیتابیس کاری نداره، بهتره همونجا که کارتون با دیتابیس تمام میشه، اتصال به MySQL رو ببندین تا درخواستهای همزمان دیگری که وارد میشن، زمانی که اسکریپت شما وارد فرآیند طولانی خودش میشه، با مشکل اتصالهای بیش از حد (Too many connections) مواجه نشه.

تشکر از پاسخ شما جناب شهرکی ، بله درسته اسکریپت کمی پیچیده است من الان دچار مشکل شده ام و حدود به 15 گیگ به بالا رم سرور رو mysql اشغال می کنه و تا سرور رو ریست نکنم مصرف رم کم نمی شه یعنی کانکشن به mysql به صورت مداوم وجود داره

MMSHFE
جمعه 04 بهمن 1392, 22:37 عصر
اینجوری کار کنید بهتره:


public function SelectAll() {
$this->Connect();
$result = array();
$rows = mysql_query('SELECT * FROM `articles` ORDER BY `id`');
if($rows && mysql_num_rows($rows) > 0) {
while($row = mysql_fetch_assoc($rows)) {
$result[] = $row;
}
mysql_free_result($rows);
}
mysql_close();
return $result;
}

چون بهرحال شما باید رکوردها رو Fetch کنید و اگه نتایج رو توی یک آرایه معمولی PHP بگذارین، هم به راحتی با کمک دستوراتی مثل count میتونید تعداد سطرها رو بدست بیارین و هم اینکه دیگه هیچ نیازی به اتصال و Fetchکردن توی اسکریپت ندارین. منظورم اینه که توی بقیه کدتون دیگه دستورات mysql_fetch_assoc و... نیاز نیست به کار بیاد. ازطرفی استفاده از mysql_free_result هم کمک میکنه حافظه اختصاص داده شده به Resourceهای MySQL آزاد بشه (نتایج توی آرایه است. پس دیگه به Resource نیازی ندارین و بهتره حافظه رو آزاد کنید).