خب دیتابیس هم بالاخره تو فایل ذخیره میشه !
ولی همه ی کاربرا همون شروع کار با سشن مشکل دارن !
روش output bufferring رو میشه توضیح بدین ؟
درسته هر چیزی که قراره بعدا استفاده بشه روی دیسک ذخیره میشه ولی خوب DBMS برای نگهداری اطلاعات سنگین طراحی و ساخته شده ولی سشن فقط برای اینکه یه سری متغیر رو نگهداری کنه استفاده میشه پس نمیشه سیستمش رو با DBMS مقایسه کرد. البته خوب دیتابیس هم از همین سیستم لاک استفاده میکنه یعنی حتی اگر شما با دیتابیس هم سشن درست کنین و سیستم لاک درست براش در نظر نگیرین دچار مشکل میشین. در واقع وقتی دارین از سشن هندلر دیگه ای هم استفاده میکنین باید هنگام استفاده از هر کدوم از رکوردها لاکش کنین تا دچار مشکل نشین. خود mysql این کار رو براتون انجام میده ولی داشتن اطلاعات درباره ش بد نیست.
بافرینگ رو هم آخر همین پست توضیح میدم.
منظورتونو درباره جمله دوم که همه کاربرا همون شروع کار با سشن مشکل دارن رو متوجه نشدم.
موافقم . دلیل هم داره اونم اینه که .
session_start از سیستم فایلینگ استفاده می کنه (همون طور که می دونید تو فولدر tmp )
ولی روش دیتابیس . خب از دیتابیس استفاده می کنه
از نظر امنیت و سرعت عالیه !!
-------------------------------------
خب DBMS لودش زیاده
ولی mysql اینطوری نیست
چون سیستمش به صورتی هست که هر جدول رو در یک فایل نگهر می داره
در ضمن مثل همیشه php با mysql رفیقه

-------------------------------------
با Output Buffer میشه
این کارو کرد . !!
منظورتون همون
http://ir.php.net/manual/en/ref.outcontrol.php
است ؟
میشه توضیح بدین ؟
منظورتونو درباره اینکه DBMS لودش زیاده ولی MySQL اینطوری نیست رو متوجه نشدم. اگر میشه بیشتر توضیح بدین.
درباره اینکه MySQL هر ردیف رو داخل یک فایل نگه میداره من اطلاعی ندارم ولی توی روش هندلینگ با فایل هم متغیرهای هر سشن توی یه فایل جدا هستن. در واقع هر رکورد جدول سشن دیتابیس با هر فایل سشن هندلینگ عادی یکسانه.
نمیدونم چرا تعجب کردین وقتی گفتم با بافرینگ میشه این مشکل رو حل کرد. دقیقا با همین توابعی که لیستشونو لطف کردین و گذاشتین میشه مشکل BOM سشن رو حل کرد. خوب بافرینگ صرفا برای این کار ساخته نشده ولی یکی از استفاده هاش که بیشتر معموله برای همین موضوعه. سیستم کاریش هم ساده س. بطور کلی ما با استفاده از بافرینگ میایم و تمام خروجی های کدمون (مثلا متنها که شامل تگهای HTML هم میشن) رو سمت سرور نگه میداریم و نمیفرستیم سمت کلاینت تا زمانی که اجرای کد تموم بشه و بعد تمام خروجی رو یک جا میفرستیم برای کلاینت. این باعث میشه که شما هر قسمتی از کد بتونین هدر HTTP که خوب سشن و کوکی دو موردی هستن که از هدرها استفاده میکنن رو بفرستین بدون اینکه پیغام Headers already sent رو بگیرین.
یه تستی رو من خودم انجام دادم برای مقایسه دیتابیس با سشن توی حالت عادی. شاید به نظرتون خنده دار باشه ولی برای خودم جالب بود که بفهمم سرعت اجرای سشن استارت و یه کوئری ساده دیتابیس چقدر فرق داره.
کدی که باهاش تست کردم اینه:
PHP:
<?php
$session_start = microtime();
session_start();
$session_end = microtime();
mysql_connect('localhost','root');
mysql_select_db('shorepromotions');
$db_start = microtime();
$db_result = mysql_query("select * from `colors` where `title`='black'");
$db_end = microtime();
mysql_close();
print($query);
print("$session_start - $session_end =>".($session_end - $session_start).'<br/>');
print("$db_start - $db_end =>".($db_end - $db_start));
?>
این کد رو من به دو صورت اجرا کردم. هر روش رو هم پنج بار تکرار کردم و از خروجی میانگین گرفتم تا یه مقدار دقتش بیشتر باشه.
روش اول خوب پنج بار با فاصله پنج ثانیه صفحه رو ریفرش کردم و نتیجه:
کد:
0.75000400 1251546743 - 0.75039100 1251546743 =>0.000387
0.75368200 1251546743 - 0.75412100 1251546743 =>0.000439
0.95312900 1251546752 - 0.95352200 1251546752 =>0.000393
0.95681300 1251546752 - 0.95725200 1251546752 =>0.000439
0.32812800 1251546761 - 0.32851000 1251546761 =>0.000382
0.33223400 1251546761 - 0.33270100 1251546761 =>0.000467
0.45312900 1251546771 - 0.45353700 1251546771 =>0.000408
0.45665700 1251546771 - 0.45725800 1251546771 =>0.000601
0.03125400 1251546780 - 0.03165500 1251546780 =>0.000401
0.03484500 1251546780 - 0.03527700 1251546780 =>0.000432
و روش دوم توی هر بار ریفرش دستم رو 2 ثانیه روی F5 نگه داشتم تا یه سری ریکوئست پشت سر هم فرستاده بشه و نتیجه شد:
کد:
0.18750300 1251546934 - 0.19204800 1251546934 =>0.004545
0.19850700 1251546934 - 0.19908500 1251546934 =>0.000578
0.39062900 1251546949 - 0.39726400 1251546949 =>0.006635
0.40085300 1251546949 - 0.40147000 1251546949 =>0.000617
0.37500300 1251546959 - 0.38170300 1251546959 =>0.0067
0.38628300 1251546959 - 0.38712800 1251546959 =>0.000845
0.42187800 1251546968 - 0.43050000 1251546968 =>0.008622
0.43625300 1251546968 - 0.43669100 1251546968 =>0.000438
0.46875300 1251546976 - 0.47569300 1251546976 =>0.00694
0.47948800 1251546976 - 0.48005900 1251546976 =>0.000571
میانگین روش اول شد:
کد:
Session => 0.0003942
Database => 0.0004756
و روش دوم:
کد:
Session => 0.0066884
Database => 0.0006098
توی روش اول مشخصه که خوب سشن هندلر فایل سریعتره ولی توی روش دوم بخاطر همون لاک شدن فایل و منتظر موندن اسکریپت سرعت میاد پایین و تقریبا 10 برابر کمتر از دیتابیس میشه.
درسته. قبول. حرف شما درست بود که دیتابیس سریعتره ولی چند تا نکته هست:
- این تست لوکال بود و سرعت ارسال و دریافت هدرها زیاد بودن برای همین هم درصد تداخل ریکوئستهای سشن بیشتر بود. اگر تست آنلاین بود خوب مسلما زمان سرباری که صرف ارسال و دریافت هدرها میشد میتونست یه زمان اضافه به هندلر فایل بده که کارش رو با فایل تموم کنه تا زمانیکه هدر بعدی میاد.
- اینجا فقط یه کوئری ساده فرستاده شده و کار خاص دیگه ای انجام نشده. ممکنه تعداد کوئریها بیشتر باشن یا کارهای دیگه ای هم با نتیجه کوئری انجام بشه که خوب مسلما زمان بیشتری میبره.
- تعداد رکوردهای داخل جدولی که من ازش کوئری زدم 20 تا بیشتر نبود. توی تعداد رکوردهای بالاتر خوب سرعت کمتر میشه.
بهرحال بازم میگم هر روشی مزایا و معایب خودش رو داره. سشن هندلینگ PHP بنظر من باگ نداره فقط تحت شرایط مختلف بصورت طبیعی واکنشهای مختلفی نشون میده. این برنامه نویسه که انتخاب میکنه کدوم روش براش بهتره.