Nwahy Articles V3 pro

درس : نظام تخزين المخرجات ( Cache Output ) بالشرح المفصل والامثلة العملية

درس : نظام تخزين المخرجات ( Cache Output ) بالشرح المفصل والامثلة العملية

القسم php - الزيارات 12804 - التاريخ 16/12/2008 - الكاتب EbNCaNa
السلام عليكم ورحمة الله وبركاته

الكاش … كلمة سمعها الكثيرين … منهم المحترفون ومنهم المبتدئون … قرأت هذه الكلمة لأول مرة في منتديات جنة العرب … حيث كنت بصدد تركيب منتدى خاص بي … وكان من ضمن تعليمات الاخوة المشرفين عند تركيب النسخة هو اعطاء مجلد ” الكاش ” التصريح الامني اللازم لضمان الحماية الافضل للمنتدى … لم اكن اعرف ماذا يعني الكاش ولماذا يستعمل … ولكني الان وقد عرفت الجواب لسؤالي والحمد لله … اريد ان اشارككم بما عرفته عن هذا المجلد وماذا يعني وما هي الفكرة الكامنة من وراء استعماله في كثير من انظمة ادارة المحتوى العالمية …

اعلم بان قسم من القراء يعلم الكثير عن الكاش ومنهم من يستعملونه في موافقعهم بدون ان يعرفوا لماذا يستعمل … ومن منكم قد قرأ في احدى المرات عن ما يسمى CacheLite وعرف عنها الكثير فاني متاكد بان القسم الكبير من متعلمي البرمجة لا يعلم شيء عن هذه الخاصية ولهذا السبب فاني اتوجه لكم بهذا المقال اليوم .

جميعنا يعلم بان الصفحات الديناميكية قد تستغرق وقت اكثر من الصفحات العادية لكي تحمل للمتصفح وتظهر كاملة , الأمر الذي يجبر المتصفح على الانتظار … ولكن صبره سرعان ما سينفذ ويخرج حانقا من الموقع ما لم تظهر الصفحة خلال ثواني معدودة … ما الحل اذن ؟؟

افترض بان قسم منكم يرى كلامي عار عن الصحة ولا مكان له من الاعراب في عالم البرمجة … وانا لا الوم هذه الشريحة لانها لم تقم ببرمجة اي عمل او مشروع بشكل ذاتي او ببرمجة كاملة وعليه فانهم سينكرون ما اقول … في الماضي كانت عملية ارسال محتوى صفحة غير ديناميكية من سيرفر الموقع الى المتصفح عملية صعبة وشاقة بعض الشيء على كلا الطرفين ولكن العلم يتقدم والمطورون يخرجون يطرق جديدة في كل يوم لتسهيل عملية معالجة البيانات وارسالها باقصى سرعة ممكنة الى وجهتها ولهذا السبب نرى كم هي سهلة وسريعة وسلسة عملية ارسال صفحة html عادية الى اي متصفح … لم يعد هذا الامر بالتحدي الكبير لأن مثل هذه صفحات تحتوي على بعض النصوص والصور وهذا المحتوى لا يسبب العبء الكبير على السيرفر .

اليوم اصبح يكمن التحدي الحقيقي في هذا المجال بكيفية جعل البرنامج او السكربت الذي قمنا ببنائه يعالج بنفس السرعة التي يعالج بهذا المحتوى الغير ديناميكي واعتقد بان الغرب قد قطع شوطا كبيرا في هذه النقطة ونحن العرب كالعادة … تصلنا آخر صيحات البرمجة بعد وقت لا بأس فيه من انطلاقها والسبب واضح وهو كتمان العلم , فترى المبرمج العربي قد تعرف على تقنية جديدة وثورية في مجال برمجي معين عندها يقوم ببناء برنامج معين او سكربت … ويقوم بتشفير اكواده ويبدأ ببيعها واذا طلب احدهم معلومة عن المحتوى او الطريقة فان الويل سيكون من نصيب الاخير .

لا اريد ان اطيل عليكم بالكلام وسأبدأ بان الله بشرح طريقة ” تخزين المحتوى او تخزين المخرجات “ Output Caching وهذه الطريقة رائعة جدا لمعالجة الصفحات الديناميكية وارسالها للمتصفح باكبر سسرعة ممكنة … والفكرة هي ان السيرفر يقوم بعمل نسخة من محتوى الصفحة التي قمنا بزيارتها ويقوم بحفظ هذه النسخة بمجلد معين عادة ما يكون اسمه Cache , يحتوي الملف المخزن في هذا المجلد على بيانات الصفحة بعد معالجتها من قبل المتصفح وترجمة جميع الاكواد الى لغة html وهذا يعني ان الملف المخزن للصفحة الديناميكية هو ملف لكود غير ديناميكي وبالتالي فاني اعتقد بانكم ادركتم الجدوى من هذه الطريقة .

نفترض الان بان الزائر قد انتقل الى صفحة اخرى من الموقع … وتصفح جميع صفحات الموقع وبعد دقائق عاد الى الموقع ليتصفحه من جديد … هل سيكون فرق بين سرعة عملية دخول الصفحة قبل وبعد تخزين نسخة لها ؟؟؟ نعم بالتأكيد … فنظام ” تخزين المحتوى او المخرجات ” يعمل في بداية كل امر لطلب صفحة معينة … يقوم بالبداية بفحص ما اذا كان لهذه الصفحة نسخة في مجلد Cache فاذا كانت النتيجة ايجابية فانه لن يعالج نفس الاكواد البرمجية في الصفحة الحالية والتي قد تحوي الكثير من الاوامر البرمجية والتي تشكل الضغظ على السيرفر وقد تحوي ايضا استعلامات لقواعد البيانات وكل هذه الاوامر هي التي تقوم بالتقليل من سرعة الصفحات عند طلبها اما اذا كانت النتيجة سلبية … اي ان المجلد Cache لا يحوي نسخة لهذه الصفحة فان النظام سيقوم حالا بعمل نسخة لهذه الصفحة ويخزنها في المجلد .

اعلم بماذا يفكر قسم كبير منكم الآن … لسان حالهم يقول : ” ماذا يقول هذا المجنون … فالصفحات الديناميكية اسم على مسمى وهي تتميز عن الصفحات العادية بكون بياناتها تتغير باستمرار فمثلا موقع للاخبار او منتدى يمكن ان يتغير محتوى الصفحة فيه كل دقيقة او اقل فاذا استعملنا هذه الخاصية عندها سيقوم السيرفر بتخزين نسخ للصفحات في وقت معين … وبعد مدة من الزمن يقوم صاحب الموقع بتجديد البيانات عندها سيدخل الزائر ويرى نفس المحتوى القديم ولن يرى البيانات الجديدة وبالتالي سوف يخرج من الموقع معتقدا بانه لا يأتي بجديد ” !!

هذا التفكير جميل جدا ويدل على الفهم السليم للفرق بين الصفحات العادية والصفحات ذات المحتوى الديناميكي وهذا سيساعد اصحاب هؤلاء الادعاء بفهم الفكرة عندما سنقوم بعرضها برمجيا وابشرهم بان هناك حل مناسب جدا لهذه المشكلة .

في الحقيقة فان في هذا النظام الرائع يوجد عداد يحسب وقت او فترة الاغراق لكل ملف داخل مجلد cache فعندما يقوم النظام بانشاء ملف cache جديد فان فان من ضمن الخصائص التي تسجل لهذا الملف وكأي ملف اخر في انظمة الحواسيب يسجل تاريخ انشاء الملف مع الوقت بدقة …

في بداية الملف النظام نقوم بتحديد فترة الاغراق للنظام بشكل عام وهذه الفترة يحددها كل صاحب موقع حسب اختياره فهناك اشخاص يتوقعون ان افضل فترة اغراق للموقع هي 10 دقائق ومنهن ما يتوقع بان 10 دقائق ليست كافية وانما 5 تكون انسب .

وفترة الاغراق هي المدة الزمنية ( يمكن ان تكون بالدقائق او الثواني او الساعات او اكثر ) التي تمر منذ انشاء ملف الـ cache وحتى انتهاء هذه المدة وهذا يعني انني ان قمت بتحديد فترة الاغراق 10 دقائق في الموقع مثلا فان اي زائر يدخل سيقوم نظام تحزين المحتوى “ Output Caching” بفحص شرطين اساسيين اما الاول فانه يفحص اذا ما كانت الصفحة التي نقوم بتصفحها مدرجة ضمن “صفحات التجاهل” وهي الصفحات التي نوفق عمل نظام التخزين عند الدخول اليها , بمعنى اننا نريد من السيرفر ان يعالج الاكواد البرمجية لهكذا نوع من الصفحات كل مرة ندخل فيها للصفحة ولا يقوم بتخزين نسخ لها في مجلد الـ cache .

اما الشرط الثاني وهو الخاص بفترة الاغراق … حيث يقوم النظام بالتحقق من صلاحية ملف cache … بمعنى انه اذا كان قد مر 10 دقائق او اكثر على انشاء هذا الملف فان النظام سيقوم تلقائيا بتجديد محتوى الملف وادخال البيانات المحدثة اليه من خلال تشغيل الصفحة الديناميكية بشكل عادي … واما اذا لم يتحقق هذا الشرط اي انه لما يمر لحد الان سوى 5 دقائق مثلا من اصل 10 … فان النظام سيقوم باستخراج المحتوى المخزن للصفحة الحالية من المجلد cache وعرضه لنا وهكذا فانه لن يكرر نفس العمليات والاستعلامات التي سوف يكررها فيما لو لم يكن الموقع يحوي على هذا النظام , وعليه فانه سوف يخرج لنا المحتوى الـ html المترجم للصفحة وهذا لن يكلف السيرفر شي من الضغط او تبادل البيانات .

الآن وقد قمنا ببلورة الفكرة نظريا وسننتقل الآن للقسم العملي ( البرمجي ) من هذا المقال وفيه سوف نعرض الكود اللازم لكي نمتلك نظام تخزين خاص بموقعنا , ينقسم الكود لقسمين … قسم نقوم بوضعه قبل كود الصفحة نفسها … والقسم الاخر نقوم بوضعه بعد الانتهاء من كتابة كود الصفحة .

الكود البرمجي الذي سنضعه في بداية الصفحة وقبل الشروع بكتابة الكود الاساسي :

<?

// الاعدادات العامة
$cachedir = ‘cachefold/’; // مسار مجلد الكاش في الموقع - مفضل ان تبقيه خارج مجلد الروت
$cachetime = ‘10&#8242;; // فترة الاغراق بالدقائق
$cacheext = ‘cache’; // امتداد ملفات الكاش التي سوف تخزن في مجلد الكاش - عادة ما يكون cache,html,txt

// قائمة التجاهل
$ignore_list = array(
‘page1.php’,
‘page2.php’
‘page3.php’
// يمكنك ان تضع اي صفحة لتكون في هذه المصفوفة
);

// بداية تنفيذ الكود
$page = ‘http://’ . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; // طلب عنوان الصفحة الحالية
$cachefile = $cachedir . $style . md5($page) . ‘.’ . $cacheext; // تعريف ملف الكاش اما لاستيراده او لبنائه

$ignore_page = false; // اعطاء الصفحة الصفة الملائمة اما صفحة عادية او ضمن قائمة التجاهل
for ($i = 0; $i < count($ignore_list); $i++) {
$ignore_page = (strpos($page, $ignore_list[$i]) !== false) ? true : $ignore_page;
}

$cachefile_created = ((@file_exists($cachefile)) and ($ignore_page === false)) ? @filemtime($cachefile) : 0; // فحص صلاحية ملف الكاش حسب الشروط التي ذكرناها في الاعلى
@clearstatcache();

// فحص اذا كان ملف الكاش لهذه الصفحة ملائم ام انه تجاوز فترة الاغراق
if (time() - $cachetime < $cachefile_created) {

// اذا كان الملف ملائم فان النظام سيقوم باستخراج محتواه وعرضها للزائر

ob_start(’ob_gzhandler’);
@readfile($cachefile);
ob_end_flush();
exit();

}

// اذا لم يتحقق الشرط السابق فاننا بحاجة لبناء ملف كاش جديد لهذه الصفحة

ob_start();
}

?>


والآن سنعرض الكود البرمجي والذي سنضعه بعد كتابة الكود الاساسي للصفحة :

<?

if ($ignore_page === false){
// اذا لم تكن هذه الصفحة ضمن قائمة التجاهل فان النظام سيقوم بقرائه كود الهتمل لهذه الصفحة
$fp = @fopen($cachefile, ‘w’);

// بعد القراءة يقوم النظام بحفظ كود الهتمل داخل ملف كاش جديد في مجلد الكاش
@fwrite($fp, ob_get_contents());
@fclose($fp);
}

ob_end_flush();
}

?>


والان اخواني وبعد الشرح الممل اعتقد بان كل شي واضح … ولكن هذا الكود هو النواة فقط فهناك الامكانية لتطويره بشكل كبير وخيالي … وضعت بين ايديكم المواد الخام والابداع يكمن في تطوير التقنيات والطرق الخلاقة للوصول لمستوى مقبول في عالم البرمجة .


هذا المقال لـ EbNCaNa
مشاركة الموضوع
Facebook Twitter Google+ Pinterest Reddit StumbleUpon Linkedin Tumblr Google Bookmarks Email
عدد المقيّمين 1 وإجمالي التقييمات 5
12345

أضف تعليقك على الموضوع

التعليقات على المقالة 2

  • ابوليالي
    ابوليالي
    29/3/2012
    اخي الكريم واضح بالجروح حياك الله

    نظام الكاش انت تستغله كيفما تشاء سواء يكون التخكم به عن طريق الـ ip او عن طريق ربطه بعدد ايام محدده او بشكل يومي او فور مغادرة الزائر للصفحه وايضا بالامكان التحكم به عن طريق قاعدة البيانات او عن طريق Session الزائر

    والله ولي التوفيق

  • واضح بالجروح
    واضح بالجروح
    23/3/2012
    مقالة رائعه ومميزة اخوي

    ولكن اعتقد الكـاش يعتمد اعتماد كلي على الزيارة الآولى للزائر وانه لو تم حذف الكوكيز من جهاز الزائر يعود وينفذ عملية حفظ الصفحة في ملف الكاش من جديد او انه يقوم بحفظ الاي بي للزائر ؟؟

    واظهارهـاا فقط ؟؟