PDA

View Full Version : ()mysql_pconnect



mehdiangal
جمعه 09 شهریور 1386, 10:14 صبح
سلام دوستان .
این mysql_pconnect چیه ؟
اطلاعات خودم : کانکشن دائمی باز میکنه تا وقتی که سرور کار میکنه ! و با تمام شدن اسکریپت اتصال قطع نمیشه . برعکس mysql_connect که با اجرای فایل php کانکشن باز میشه و با تمام شدنش بسته میشه .
خوب این خیلی خوبه !!! اگه چند تا درخواست همزمان داشته باشیم با mysql_connect باید چند تا کاننکشن باز بشه و خود همین باز شدنش هم فکر میکنم باعث افت کارایی میشه + اینکه چند تا هم باز بشه .
ولی فکر میکنم مسئله به این سادگی نباشه !!؟ مثل اینکه یه سری تنظیمات رو سرور میخواد و ... . و حتما معایب دیگه ای هم نسبت به mysql_connect داره .. ؟؟؟؟
ممنون میشم توضیح بدید که چه موقع خوبه که استفاده بشه و چه موقع بد و ......
تشکر .

jhoseinii
جمعه 09 شهریور 1386, 10:35 صبح
ببینید
در مواردی که دیتابیس برای تمام کاربران مشترکه pconnect بهینه تر عمل میکنه چون ارتباط بین php.server و دیتابیس رو در اولین درخواست برقرار میکنه و دیگه اونو close نمیکنه
اما در مواردی که هر کاربر درخواست ایجاد ارتباط بین php.server و mysql.server به صورت خاصی با دیتابیس خاصی رو میده connect بهینه تره، چون نگه داشتن کانکشن ها مفید نیست و به دلیل تعدد این کانکشن ها سرور ممکنه دوچار اختلال بشه و این جور اختلال ها هم با کاهش امنیت همراهه

mehdiangal
جمعه 09 شهریور 1386, 13:04 عصر
ممنون از جوابتون . ولی من منظورتون رو از این قسمت ها نمیفهمم :

1-یعنی چی دیتابیس برای کاربران مشترکه ؟
2-مگه pconnect چند تا کانکشن باز میکنه . لطفا یکم توضیح بدید
3-ارتباط بین php و mysql به صورت خاص ؟؟ یعنی چی ؟

من فقط تو برنامم یه دیتابیس دارم که همه ی کاربرا با همون کار میکنن . بهتره چیکار کنم ؟
ممنون.

jhoseinii
جمعه 09 شهریور 1386, 13:30 عصر
1)خوب همه ی برنامه ها مثل برنامه شما فقط به یک دیتابیس کفایت نمیکنن
ممکنه یه برنامه 100 دیتابیس داشته باشه و بر حسب نام کاربری کاربرا به دیتابیس مربوطه کانکت کنه
3) و یا اینکه اصلاً دیتابیس روی یه سرور دیگه باشه
2) connect برای هر کاربر و برای هر درخواست یه کانکشن باز میکنه و بعد از پایان اجرا، میبندتش،
اما pconnect یه کانکشن باز میکنه، و دیگه نمیبنده، ولی اگه قرار باشه به 100 تا کانکشن با سرور های مختلف رو فعال نگه داره ...

تو اکثر برنامه هایی که نوشته میشه از pconnect استفاده میشه، چون اکثراً با یه دیتابیس کار میکنه، شما هم از pconnnect استفاده کنید یه حالت زیر





$GLOBALS['DB_POINTER'] = false;

function db_connect(){
if($GLOBALS['DB_POINTER']){
return $GLOBALS['DB_POINTER'];
}
if($db= @ mysql_pconnect($GLOBALS['sqlhost'], $GLOBALS['sqluser'], $GLOBALS['sqlpass'])){
if(@ mysql_select_db($GLOBALS['dtbname']) ){
$GLOBALS['DB_POINTER']=$db;
return $GLOBALS['DB_POINTER'];
}
}
die("Invalid mysql connection");
}

oxygenws
جمعه 09 شهریور 1386, 13:36 عصر
از pconnet استفاده نکنید، مگر اینکه بدونید اصلا چطوری باید باهاش کار کنید! چون باعث میشه بی نهایت اتصال باز روی سرورتون ایجاد بشه.
برای روش دقیق استفاده ازش هم راهنمای PHP دقیق توضیح داده.

jhoseinii
جمعه 09 شهریور 1386, 16:24 عصر
نه، اینجوریا هم که میگید نیست
اینجا رو یه نگاه بندازید (http://hostprogressive.com/support/php_5_docs/features.persistent-connections.html)

mehdiangal
جمعه 09 شهریور 1386, 16:33 عصر
این رو ببینید : (php.net)

if you had 20 different child processes that ran a script that made a persistent connection to your SQL server, you'd have 20 different connections to the SQL server, one from each child.
child processes چیه ؟
اینم یه اخطار دیگه : (php.net)

Warning
There are a couple of additional caveats to keep in mind when using persistent connections. One is that when using table locking on a persistent connection, if the script for whatever reason cannot release the lock, then subsequent scripts using the same connection will block indefinitely and may require that you either restart the httpd server or the database server. Another is that when using transactions, a transaction block will also carry over to the next script which uses that connection if script execution ends before the transaction block does. In either case, you can use register_shutdown_function() (http://ir.php.net/manual/en/function.register-shutdown-function.php) to register a simple cleanup function to unlock your tables or roll back your transactions. Better yet, avoid the problem entirely by not using persistent connections in scripts which use table locks or transactions (you can still use them elsewhere).
اون بخشی که درباره ی table locking نوشته در مورد mysql هم صادقه ؟

لینک صفحه : http://www.php.net/manual/en/features.persistent-connections.php
jhoseinii لینکی که شما گزاشتید کپی شده از سایت php ی !

jhoseinii
جمعه 09 شهریور 1386, 17:10 عصر
jhoseinii لینکی که شما گزاشتید کپی شده از سایت php ی !
شاید برعکس :دی

حالا نتیجه چی شد؟ بنویسید

mehdiangal
شنبه 10 شهریور 1386, 00:10 صبح
نتیجه بستگی داره به اینکه child processes چی باشه .. ؟؟
و بهتره وقتی از table locking و transaction هم استفاده میکنیم از pconnect استفاده نشه .

oxygenws
شنبه 10 شهریور 1386, 10:37 صبح
child process به آپاچی ربط داره و تقریبا همیشه child process داریم و معمولا، تاکید می کنم معمولا، روی حدود ۲۰ الی ۵۰ تنظیم میشه و یعنی شما به ازای هر دیتابیس برای همیشه ۵۰ تا اتصال باز خواهید داشت و این برای یک سرور اشتراکی یکمی یعنی فاجعه!!!

شما اگر می دونستید ASP کار ها برای هر کاری که با دیتابیس دارند، یک بار اتصال رو باز می کنند و بعدش می بندند دیگه سر این قضایا بحث نمی کردید!!!!! :دی
در مورد ادامه ندادن شوخی می کنم، حتما بحث رو ادامه بدید.

mehdiangal
شنبه 10 شهریور 1386, 18:33 عصر
من که نفهمیدم child process چیه !!؟؟؟چیه؟؟! خوب بلاخره این pconnect باید بدرد یه کاری بخوره یا نه ؟؟؟؟؟


شما اگر می دونستید ASP کار ها برای هر کاری که با دیتابیس دارند، یک بار اتصال رو باز می کنند و بعدش می بندند دیگه سر این قضایا بحث نمی کردید!!!!! :دی
من میدونستم d: نمیدونم چی چی nothing و .. close .. یادم رفته . من تو همین php هم خودم کانکشن رو میبندم mysql_close

oxygenws
شنبه 10 شهریور 1386, 20:45 عصر
مثل الان، اگر شک داری که pconnect به دردت می خوره یا نمی خوره، قطعا ازش استفاده نکن.

در مورد child process باید بری در مورد آپاچی بیشتر مطالعه کنی. شاید کلمات کلیدی prefork یا perchild یا ... برای جستجو مناسب باشند :)

mehdiangal
یک شنبه 11 شهریور 1386, 05:38 صبح
مثل الان، اگر شک داری که pconnect به دردت می خوره یا نمی خوره، قطعا ازش استفاده نکن
یه چیزی بیشتر از شک دارم :دی .
پس فعلا بیخیال تا ببینم بعدا" چی بشه . شما هم اگه به نتیجه ی روشنی رسیدید ما رو هم بی نصیب نزارید ! مرسی .

jhoseinii
یک شنبه 11 شهریور 1386, 09:51 صبح
این کد برای هر بار باز شدن صفحه فقط یک بار درخواست اتصال میده،
اگه از pconnect استفاده نمیکنید، از این استفاده کنید، بهینه تره فکر میکنم

$GLOBALS['DB_POINTER'] = false;
function db_connect(){
if($GLOBALS['DB_POINTER']){
return $GLOBALS['DB_POINTER'];
}
if($db= @ mysql_connect($GLOBALS['sqlhost'], $GLOBALS['sqluser'], $GLOBALS['sqlpass'])){
if(@ mysql_select_db($GLOBALS['dtbname']) ){
$GLOBALS['DB_POINTER']=$db;
return $GLOBALS['DB_POINTER'];
}
}
die("Invalid mysql connection");
}