استفاده از سیستم کش در cms

sharktech

کاربر فعال
یک سیستم مدیریت محتوا (CMS) باید طوری برنامه نویسی شده باشد که از امکانات و منابع موجود کمترین استفاده را کرده و در عین حال بهترین بازده و نتیجه را داشته باشد.
یکی از مهمترین منابع و اصلی ترین آن در یک CMS, دیتابیس یا همان پایگاه داده می باشد که تمامی مشخصات, تنظیمات و محتوای یک CMS در آن ذخیره شده و در مواقع لزوم از دیتابیس استخراج شده و به نمایش در می آیند.
اما اگر قرار باشد که برای دانستن اطلاعات, مدام آنها را واکشی کرده و نمایش دهیم, بار محاسباتی زیادی را روی سرور وارد می کنیم و مهمتر آنکه سرعت لود شدن سایت نیز به صورت چشم گیری کاهش پیدا می کند.
البته این قضیه در سایت های کم ترافیک به چشم نمی آید اما در سایت های پربازدید این مسئله ممکن است باعث داون شدن سرور و سایت شود.
اما چگونه می توان یک CMS را طوری طراحی کرد که دچار چنین عواقبی نشده و در عین حال سرعت لود بیشتری را نیز داشته باشد ؟
جواب این سوال استفاده از سیستم کش (cache) در برنامه نویسی CMS می باشد. البته استفاده از سیستم کش تنها در برنامه نویسی وب کاربرد ندارد و در هر جایی که لازم باشد می توان از این سیستم بهره برد.
یک CMS از یک سری دستورات برای ذخیره, واکشی, تغییر و حذف اطلاعات دیتابیس تشکیل شده است که تمامی این رخ دادها توسط یک زبان برنامه نویسی تحت وب مانند : php و asp کنترل و تمامی این کارها بر روی یک دیتابیس اعمال می شود.
عملی که سیستم کش انجام می دهد واکشی و ذخیره قسمت مورد نظر اطلاعات موجود از دیتابیس در یک فایل متنی می باشد تا زمانی که تغییری در همان اطلاعات در پایگاه داده صورت پذیرد.


خوب در بخش اول توضیحاتی در مورد استفاده از سیستم کش در سیستم مدیریت محتوا خوندین و در این بخش وارد قسمت عملی کار میشیم و با کد ها و برنامه نویسی این سیستم آشنا می شیم.
اول از همه با کدی آشنا می شیم که اطلاعاتی رو که نیازمون هست و از دیتابیس استخراج می کنیم رو به صورت فایل متنی و با فرمت html ذخیره می کنه :


PHP:
// شروع کش
ob_start();

// استخراج اطلاعاتی از دیتابیس
$query = mysql_query("select * from table ORDER BY id");
while ($row = mysql_fetch_array($query)) {
    echo $row['id'].' | '.$row['content']. '<br />';
}

// ذخیره سازی اطلاعات در یک متغییر
$buffer = ob_get_contents();

// پایان ذخیره اطلاعات در کش
ob_end_flush();

// اطلاعات ذخیره شده در متغیر در یک فایل ذخیره می شود
$fp = fopen($file, "w");
fwrite($fp, $buffer);
fclose($fp);
خوب کد نیاز به توضیح بیشتری نداره و توضیحاتش در کامنت ها هست.
و حالا به کدی می رسیم که وظیفه تشخیص وجود فایل کش رو بر عهده داره و در این تکه کد دو حالت پیش میاد :
۱- اگر فایل کش وجود داشت, محتوای ذخیره شده در آن فایل را نشان می دهد.
۲-اگر فایل کش وجود نداشت, کد مربوط به واکشی اطلاعات از دیتابیس و ذخیره آن در یک فایل را اجرا می نماید.


PHP:
// آدرس فولدر برای ذخیره فایل های کش
$cacheDir = dirname(__FILE__) . '/cache/';
$file = $cacheDir . 'index.html';

// یک دستور شرطی که وجود فایل را تشخیص می دهد
if (file_exists($file))
{
    // خواندن محتوای فایل و نشان دادن آن در مرورگر
     header("Content-Type: text/html");
     readfile($file);
}
و کد نهایی که ترکیبی از هر دو کد می باشد :


PHP:
// آدرس فولدر برای ذخیره فایل های کش
$cacheDir = dirname(__FILE__) . '/cache/';
$file = $cacheDir . 'index.html';

// یک دستور شرطی که وجود فایل را تشخیص می دهد
if (file_exists($file))
{
    // خواندن محتوای فایل و نشان دادن آن در مرورگر
     header("Content-Type: text/html");
     readfile($file);
}
else
{
    // شروع کش
    ob_start();

    // استخراج اطلاعاتی از دیتابیس
    $query = mysql_query("select * from table ORDER BY id");
    while ($row = mysql_fetch_array($query)) {
        echo $row['id'].' | '.$row['content']. '<br />';
    }

    // ذخیره سازی اطلاعات در یک متغییر
    $buffer = ob_get_contents();

    // پایان ذخیره اطلاعات در کش
    ob_end_flush();

    // اطلاعات ذخیره شده در متغیر در یک فایل ذخیره می شود
    $fp = fopen($file, "w");
    fwrite($fp, $buffer);
    fclose($fp);
}
شما می تونین با تغییر این قسمت از کد :


PHP:
$file = $cacheDir . 'index.html';
و عوض کردن “index.html” هر اسم دیگری به فایل کش خودتون بدین و حتی می تونین اون رو به صورت دینامیک نام گذاری کنین و چندین بار از این کد توی صفحه مورد نظر خودتون استفاده کنین.
امیدوارم که از این آموزش راضی باشید و از اون توی پروژه های خودتون استفاده کنید :)


منبع : ققنوس گرافیک
 

Allahparast

Member
خوب ممکنه یک فایلی از سیستم ویرایش شده باشه و یه جیزی هم اضافه شده !
 

D.A.V.O.O.D

Member
سلام ، ضمن تایید صحبت های الله بار ، روشی که شما معرفی کردید ، روش خوبیه ، اما روی همه سایت ها جواب نمیده !
شما فرض کن که توی سایتت یه بلوک مطالب تصادفی یا کاربران آنلاین یا ... داشته باشیم !
خوب مسلما فایل های خروجی با هر بار رفرش صفحه به یک شکل نخواهد بود ، پس اینجاست که این روشی که شما معرفی کردید روش خوبی نیست .

اما پیشنهاد من اینه که در صورتی که سایت اینگونه بود ، می بایست مکان هایی استاتیک را با مکان های رندوم جدا در نظر گرفت و با استفاده از متد هایی که برنامه نویس داره و Php بهش اجازه میده ، مطالب دینامیک ( تصادفی) را به فایل کش شده اضافه کرد .

موفق باشید :wink:
 
آخرین ویرایش:

sharktech

کاربر فعال
خب این نقطه کاملا معلومه که نمیشه از این روش در جاهای متغییری مثل مطالب تصادفی, آمار و ... استفاده کرد !!!!

اما روی همه سایت ها جواب نمیده !

این روش در هر نوع سایتی جواب میده و این بستگی به برنامه نویسش داره !

کاربرد این روش در جایی هست که قرار نیست محتویات اون قسمت برای یه مدتی مثلا برای یه ماه, دو ماه, یه سال و ... تغییر کنه.

بعنوان نمونه شما یه مطلب تو سایتتون دارین به نام نقد فیلم سینمایی ارباب حلقه ها, خب شما این مطلب رو نوشتین و این مطلب برای مدت طولانی ( یا هرگز ) قرار نیست تغییری بکنه !
 

D.A.V.O.O.D

Member
اما چگونه می توان یک CMS را طوری طراحی کرد که دچار چنین عواقبی نشده و در عین حال سرعت لود بیشتری را نیز داشته باشد ؟

دوست عزیز شما در توضیحاتتون از کلمه cms استفاده کرده اید ، cms هم مسلما مطلب یا قسمت ثابتی نداره . کل صفحات همواره در حال تغییر است . اگه شما منظورتون یک سایت static هست که اصلا نیازی به کش نداره .
 

sharktech

کاربر فعال
cms هم مسلما مطلب یا قسمت ثابتی نداره

شما مطمئنی که cms قسمت ثابتی نداره ؟؟؟!!!

ببین دوست عزیز این آموزش نحوه و روش کلی کش رو توضیح میده و شما میتونین فقط در قسمت مطالب سایت از این استفاده کنین !

الان شما هی بیاین و بگین که این قابل استفاده نیست و امکان نداره و از این حرف ها خب منم میام میگم نه امکان داره !

شما از این آموزش در سیستم خودتون استفاده کنید تا اینطوری بهتون ثابت بشه که امکانش هست یا نه.
 

D.A.V.O.O.D

Member
شما مطمئنی که cms قسمت ثابتی نداره ؟؟؟!!!

ببین دوست عزیز این آموزش نحوه و روش کلی کش رو توضیح میده و شما میتونین فقط در قسمت مطالب سایت از این استفاده کنین !

الان شما هی بیاین و بگین که این قابل استفاده نیست و امکان نداره و از این حرف ها خب منم میام میگم نه امکان داره !

شما از این آموزش در سیستم خودتون استفاده کنید تا اینطوری بهتون ثابت بشه که امکانش هست یا نه.

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

کوروش اگه اشتباه می کنم بگو اشتباه می کنی !!! :-?
 

sharktech

کاربر فعال
نمی دونم چرا انقدر بهتون بر می خوره !؟
خب معلومه که بهم بر می خوره !!!

اینم دلیلش :

اگه شما منظورتون یک سایت static هست که اصلا نیازی به کش نداره .
مگه من مرض دارم که برای سایت استاتیک سیستم کش درست کنم !!! :-?

و اگر هم حرفی می زنم دارم روی این مقاله شما با شما بحث می کنم ! فکر کنم این انجمن ساخته شده واسه بحث علمی دیگه ! درسته !؟
روش بحث شما اصلا درست نیست, شما هی بهانه های الکی میارین که نمیشه از این روش استفاده کرد در حالی که باید دلیل درست و اصولی بیارین !

کوروش اگه اشتباه می کنم بگو اشتباه می کنی !!!
حالا این وسط آقا کوروش رو چرا صدا میکنی :lol:
 

D.A.V.O.O.D

Member
کلا در مجموع مشخصه که یه مقاله توی اینترنت دیدی ، گفنی چه جایی بهتر از اینجا !؟
حالا این وسط آقا کوروش رو چرا صدا میکنی :lol:
وقتی یه آدم قوانین جایی که داره توش فعالیت می کنه را نمی دونه ، معمولا موضوع را به عهده سرپرست جایی که داره فعالیت می کنه می گذارند .

در کل واست آرزوی موفقیت می کنم ،
 

sharktech

کاربر فعال
کلا در مجموع مشخصه که یه مقاله توی اینترنت دیدی ، گفنی چه جایی بهتر از اینجا !؟

شما همیشه زرنگ تشریف دارین ؟؟!

و زود قضاوت می کنین ؟؟!

حالا من مقالمو بزارم اینجا چه سودی واسه من داره ؟؟؟؟!!!

آدم هایی مثل شما آدم رو از به اشتراک گذاشتن دانش خودش منصرف و پشیمون میکنه !!!

واقعا متاسفم که شما آموزش منو دیدین و توش پست زدین !

در کل واست آرزوی موفقیت می کنم ،

آرزوتون هم واسه خودتون.
 

rayka

Well-Known Member
دوست عزیز شما که لایی بلدی چرا خوابت نمیمبره این دوست عزیز این مقاله رو از کجا آورده مهم نیست مهم نیت وکه دلش نمیخواد اطلاعاتش فقط مال خودش باشه و اینجا گذاشته تا دیگران استفاده کنند لطفا بجای اینکه شما زحمت بکشی از این پست ها بزنی بیا 2 تا مقاله بزار
به خیرت امیدی نیست چرا شر میرسونی
 

k2-4u

Well-Known Member
سلام خدمت دوستان!

1 - لطفا برای ثابت کردن هر صحبتی دلیل منطقی و مدرک بگذارین
2- به هم احترام بگذارین !

دوستان فکر نکنم لازم باشه من این نکات ساده رو بگم !


به نظر همدیگه احترام بگذارین .


------------------------------------------------------------------------

خب به نظر من داوود جان cms یعنی سیستم مدیریت محتوا . حالا این محتوا ممکنه یک سال یکبار عوض بشه ممکنه
یک ساعت یکبار ..... هیچ تعریف بخصوصی نداریم

این سیستم هم برای خودش کاربری داره . دیگه هرکس به دردش بخوره استفاده میکنه

---------------------------------------------------------------------------

و نکته مهم : وقتی مقاله ای می نویسید
باید علمی رفتار کنید . در رفتار علمی هم تعصب و دفاع بدون مدرک و ..... صحبت های غیر منطقی بی مورد معنی نداره .
قبل از ارسال مقاله باید خودتون رو برای حمله تحلیل گرا ها آماده کنید


هر كس بخواهد در باب دانش و حقیقت بر كرسی داوری بنشیند، خنده ی خدایان او را خراب خواهد كرد.((آلبرت انیشتین))


موفق باشین
 
آخرین ویرایش:

MMSHFE

Active Member
با سلام، ضمن تشكر از مقاله مفيدتون، يك نكته رو هم به نظرم ميرسه كه بايد بگم و اون اينكه توي CMSها هم ميشه به روشي كار كرد كه بشه از كش كردن نهايت بهره رو ببريم. براي مثال، به مطالب توي سايت يك ID اختصاص بديم و موقع كش كردن مقالات، از ID براي نام فايل استفاده كنيم. حالا ميشه موقع تغيير يك مطلب، فايل كش شده رو حذف كنيم تا دوباره ساخته بشه و موقع نمايش، چك كنيم اگه فايل نبود، از DB بخونيم و دوباره كش كنيم تا در دفعات بعدي، مراجعه ما به DB براي استخراج اطلاعات كمتر بشه.
اميدوارم منظورم رو خوب رسونده باشم. حقيقتاً مقاله مفيدي بود. از جناب sharktech متشكرم (از لينك تشكر هم استفاده كردم). جناب داوود هم فكر ميكنم با اين توضيح متقاعد شده باشن كه ميزان و چگونگي استفاده از سيستم كش، بستگي به نحوه طراحي داره. بنابراين حتي درمورد مطالب پويا مثل CMS هم ميشه از كش استفاده كرد چون همه مطالب اونها مرتباً در حال تغيير نيستند. درسته كه مطلبي اضافه ميشه يا مطلبي حذف ميشه ولي مطالب قبلي آنچنان ويرايش نميشن و ميشه اونها رو كش كنيم و موقع ويرايش، فايل كش رو حذف كنيم تا در بازديد بعدي، دوباره ساخته بشه. موفق باشيد.
موفق باشيد.
 

phpweb

Active Member
با سلام، ضمن تشكر از مقاله مفيدتون، يك نكته رو هم به نظرم ميرسه كه بايد بگم و اون اينكه توي cmsها هم ميشه به روشي كار كرد كه بشه از كش كردن نهايت بهره رو ببريم. براي مثال، به مطالب توي سايت يك id اختصاص بديم و موقع كش كردن مقالات، از id براي نام فايل استفاده كنيم. حالا ميشه موقع تغيير يك مطلب، فايل كش شده رو حذف كنيم تا دوباره ساخته بشه و موقع نمايش، چك كنيم اگه فايل نبود، از db بخونيم و دوباره كش كنيم تا در دفعات بعدي، مراجعه ما به db براي استخراج اطلاعات كمتر بشه.
اميدوارم منظورم رو خوب رسونده باشم. حقيقتاً مقاله مفيدي بود. از جناب sharktech متشكرم (از لينك تشكر هم استفاده كردم). جناب داوود هم فكر ميكنم با اين توضيح متقاعد شده باشن كه ميزان و چگونگي استفاده از سيستم كش، بستگي به نحوه طراحي داره. بنابراين حتي درمورد مطالب پويا مثل cms هم ميشه از كش استفاده كرد چون همه مطالب اونها مرتباً در حال تغيير نيستند. درسته كه مطلبي اضافه ميشه يا مطلبي حذف ميشه ولي مطالب قبلي آنچنان ويرايش نميشن و ميشه اونها رو كش كنيم و موقع ويرايش، فايل كش رو حذف كنيم تا در بازديد بعدي، دوباره ساخته بشه. موفق باشيد.
موفق باشيد.
من قسمتهای فوتر و پنل های سمت چپ و راست سایت رو به صورت داینامیک طراحی کردم. و برای بالابردن سرعت سایت از روش شما برای کش کردن استفاده می کنم.

اگر چندنفر بخوان به صورت همزمان به صفحه کش مربوط به فوتر سایت دسترسی داشته باشن و در همون لحظه بخوایم فایل رو حذف یا ویرایش کنیم، پی اچ پی چطور این درخواستهای همزمان و متفاوت رو مدیریت می کنه؟

لطفا توشیح بدید.
 

MMSHFE

Active Member
از اونجا که سرعت کار با فایلها در php خیلی زیاده و توابع مربوط به فایلها جزو توابع اتمیک محسوب میشن، مشکلی پیش نخواهد آمد. حتی اگه فایل حذف شده باشه و قبل از ساخت فایل کش جدید، یک نفر دیگه هم مشاهده کنه، مشکلی پیش نمیاد چون برای اون فرد از db خونده میشه. نهایتاً میتونید بعد از خوندن از db، ابتدا چک کنید ببینید فایل کش وجود داره یا نه و اگه نبود، اطلاعات خونده شده رو توی فایل کش جدید ذخیره کنید. اینطوری اگه در حین بازدید شما، یک نفر دیگه صفحه رو ببینه و فایل کش رو ایجاد کنه (در حد چند هزارم ثانیه سریعتر)، دیگه کد شما فایل کش رو نمیسازه، حتی با اینکه اطلاعات از db خونده شده! در دفعات بعد هم چون فایل وجود داره، دیگه از db نمیخونه. امیدوارم خوب توضیح داده باشم. موفق باشید.
 

phpweb

Active Member
از اونجا که سرعت کار با فایلها در php خیلی زیاده و توابع مربوط به فایلها جزو توابع اتمیک محسوب میشن، مشکلی پیش نخواهد آمد. حتی اگه فایل حذف شده باشه و قبل از ساخت فایل کش جدید، یک نفر دیگه هم مشاهده کنه، مشکلی پیش نمیاد چون برای اون فرد از db خونده میشه. نهایتاً میتونید بعد از خوندن از db، ابتدا چک کنید ببینید فایل کش وجود داره یا نه و اگه نبود، اطلاعات خونده شده رو توی فایل کش جدید ذخیره کنید. اینطوری اگه در حین بازدید شما، یک نفر دیگه صفحه رو ببینه و فایل کش رو ایجاد کنه (در حد چند هزارم ثانیه سریعتر)، دیگه کد شما فایل کش رو نمیسازه، حتی با اینکه اطلاعات از db خونده شده! در دفعات بعد هم چون فایل وجود داره، دیگه از db نمیخونه. امیدوارم خوب توضیح داده باشم. موفق باشید.
حقیقتش کمی گنگ بود !
از اونجا که سرعت کار با فایلها در php خیلی زیاده و توابع مربوط به فایلها جزو توابع اتمیک محسوب میشن، مشکلی پیش نخواهد آمد. حتی اگه فایل حذف شده باشه و قبل از ساخت فایل کش جدید، یک نفر دیگه هم مشاهده کنه، مشکلی پیش نمیاد چون برای اون فرد از db خونده میشه.
توی این بخش منظورتون رو متوجه نشدم.
فرض کنید پی اچ پی چک کنه و ببینه که فایل وجود داره، در شرایط شرط مربوط به خوندن فایل اجرا می شه، قبل از اینکه پی اچ پی بخواد فایل رو بخونه، اسکریپت آپدیت کش بیاد و فایل رو حذف کنه !

از اونجاییکه شرط خوندن فایل اجرا می شه، پی اچ پی دیگه به دیتابیس وصل نمی شه و فایل کش هم حذف شده و یه خطا باید نمایش داده بشه !

در این مورد نظرتون چیه؟
 

payamsp

Member
در همین مورد سیستم ها و فریم ورک های مختلفی رو چک کردم تا ببینم از چه روشی استفاده می کنند که اکثرا از همین روش ساده ای که دوستمون گفته بودند استفاده کرده بودند و به نظر مشکلی بوجود نمیاد اما برای اینکه مطمئن بشید که 100 درصد به مشکلی بر نمی خورید بهتره که فایل ها رو هنگام خوندن یا نوشتن lock کنید البته اکثر سیستم ها این کار رو نکرده بودند (احتمالا به خاطر افت سرعت )
من از این روش + lock کردن استفاده می کنم ، ممنون میشم سایر دوستان هم نظراتشون رو در این مورد بگند تا به یک نتیجه مطلوب برسیم
 

MMSHFE

Active Member
حقیقتش کمی گنگ بود !
توی این بخش منظورتون رو متوجه نشدم.
فرض کنید پی اچ پی چک کنه و ببینه که فایل وجود داره، در شرایط شرط مربوط به خوندن فایل اجرا می شه، قبل از اینکه پی اچ پی بخواد فایل رو بخونه، اسکریپت آپدیت کش بیاد و فایل رو حذف کنه !

از اونجاییکه شرط خوندن فایل اجرا می شه، پی اچ پی دیگه به دیتابیس وصل نمی شه و فایل کش هم حذف شده و یه خطا باید نمایش داده بشه !

در این مورد نظرتون چیه؟
هر دو سؤالتون رو با يك سؤال جواب ميدم!
سؤال : وقتي كه سرعت كار PHP با فايلها فوق العاده سريع و در حد چند هزارم ثانيه است، شما مطمئنيد كه دو كاربر اينقدر سريع (در حد هزارم ثانيه) و بطور همزمان به سايت متصل ميشن كه قبل از ساخته شدن مجدد فايل، يك نفر ديگه بخواد همون فايل رو ببينه؟ حتي اگه به احتمال يك در ميليون، چنين اتفاقي بيفته، باز هم مشكل خاصي نيست. صفحه خالي براش مياد كه با يك بار Refresh مشكل رفع ميشه!
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا