الملفات المؤقتة (cache) بأسهل الطرق
مدرج تحت قسم: دروس
الملفات المؤقتة ضرورة لكل برنامج تتم زيارته بكثرة، حيث يقوم بتخفيف الضغط عن القاعدة. وهنا أتكلم عن برنامج يجلب البيانات من القاعدة.
تصور أن يكون لديك برنامج مقالات يقوم بالاتصال بالقاعدة واستخراج عشر نتائج في الصفحة، وتصور ايضاً أن يكون عدد الزوار مثلاً مئة، إذاً مئة اتصال في اللحظة الواحدة. بالإضافة، إذا كانت لديك اتصالات أخرى مع القاعدة لجلب معلومات أخرى (مثل إعدادات الموقع والأقسام ووو).
ففكرة الملفات المؤقتة هي أنه عند جلب البيانات من القاعدة، تقوم بحفظ المخرجات في متغير وتقوم بإرساله إلى ملف مؤقت يتم إنشائه آلياً، ويتم طباعة المتغير في الصفحة كأنه لم يتم ي شيء، لكن أي زائر سيدخل بعد ذلك، سيحصل على النتائج المخزنة في الملف المؤقت دون الحاجة للاتصال بالقاعدة في كل مرة. ومع حساب عدد الزوار، تخيّل عدد الاتصالات بالقاعدة التي ستتخلى عنها ببساطة.
فوائد الملفات المؤقتة
بكل صراحة ستجد فرق كبير بين الوضع السابق والأن. بالطبع سيكون البرنامج سريع التصفح
الدوال التي سنحتاجها في الدرس
- file_exists التأكد من الملف هل هو موجود
- filectime ارجاع وقت اخر تعديل
- ob_start بداية حفظ المخرجات
- ob_get_contents تعطينا المعلومات المستخرجة
- ob_clean تقوم بمسح المعلومات التي تم حفظها في الذاكرة
- opendir مقبض المجلد
- readdir قارئ المجلد
- unlink مسح الملفات
- fopen مقبض الملفات
- fwrite الكتابة على الملفات
فكرة الدرس
سأشرح الفكرة نظريا لكي يسهل عليك عزيزي القارئ أن تفهم الشفرة
- عندما نضيف بيانات إلى القاعدة مثلاً، سنقوم بمسح الملفات المؤقتة الموجودة من قبل؛ لأنه من غير المعقول أن تكون القاعدة قد أُضيفَ إليها مقال جديد وأنت تعرض للناس القديم.
- نضع وقت للملف المؤقت حتى يتم تحديثه بعد كل ساعة مثلاً. ستقول لي بما أننا نمسح الملفات المؤقتة لحظة إضافة أي شيء جديد، فإذاً ماذا نستفيد من التحديث كل ساعة؟
الجواب بسيط..
لنفرض أنك قمت بمسح أو إضافة شيء من خلال برنامج إدارة قاعدة البيانات مثل phpmyadmin، إذاً على الأقل بعد أقل من ساعة سيتم إظهار الجديد. - نقوم بحفظ الملف المؤقت بنفس الرقم الموجود في القاعدة أو نفس رقم الصفحة..مثال بسيط:
عندما يكون لدينا صفحة لاستخراج مقال واحد مثل:
news.php?id=28
سيكون الملف المؤقت هكذا:
news-28.html
داخل مجلد الكاش أو الملفات المؤقتة
هيكلية البرنامج الذي سنستخدم عليه نظام الملفات المؤقتة
- config.php
- index.php
- news.php
- moderator.php
- caches/
ملف config.php
$dbserver="localhost"; $dbuser="root"; $dbpass=""; $dbname="news"; @mysql_connect($dbserver,$dbuser,$dbpass) or die ( mysql_error() ); @mysql_select_db($dbname) or die ( mysql_error() ); $cache="caches/"; //المجلد الذي سيتم تخزين الملفات المؤقتة فيه $exp=3600; //فترة بقاء الكاش هو ساعة ?>
ملف index.php
// سأقوم بتغير الوجهة بسرعة إلى ملف العرض طبعاً هذه الملفات للتجربة فقط
header("location: news.php");
?>
عندما نضيف بيانات إلى القاعدة، سنستخدم ملف moderator.php
// في الواقع يجب حماية ملفات التحكم بكلة المرور وأنا لم أحمِ الملف لأني فقط أشرح طريقة الكاش
include('config.php'); // تضمين ملف الاتصال بالقاعدة
// سيكون لدين جدول اسمه مثلا news
// وحقلين id و text
// اذا تم إرسال شيء ما عن طريق نموذج الإرسال
if( $_SERVER['REQUEST_METHOD'] == 'POST' ){
$news=$_POST['news']; // متغير يحمل الخبر، أذا لم أقم بحماية المتغير يجب عليك حمايته
$send=mysql_query(" insert into news (text) values ('$news') ");
if( $send ) {
echo "تم الإرسال بنجاح";
// هنا سيتم مسح المفات المؤقتة
if( $open=opendir($cache) ){
$cnt=0; // متغير يحمل قيمة عددية
while( false !== $files=readdir($open) ){
if( $files != '.' && $files != '..' ){
//إذا تم مسح ملف أو ملفات، سيتم احتساب عدد المرات
if( unlink($files) ){
$cnt++; // حفظ عدد مرات المسح
}
}
}
}
if( $cnt > 0 ){
echo " تم مسح ".$cnt." ملف";
}
}else{
echo "لم يتم الإرسال ";
}
}else{
// هنا يكون نموذج الإرسال. أعتقد أن هذا مفهوم ومعروف
// form
}
?>
الشفرة المسؤولة عن المسح يمكن جعلها دالة وتستخدمها في أي مكان بكل سهولة.
عندما استعرض المعلومات من القاعدة، سنستخدم ملف news.php
// في الواقع يجب حماية ملفات التحكم بكلمة المرور، وأنا لم أحمِ الملف لأني فقط أشرح طريقة الكاش
ob_start(); // بداية تخزين المعلومات المتدفقة
include('config.php'); // تضمين ملف الاتصال بالقاعدة
$id=(!is_numeric($_GET['id'])? 1 : intval($_GET['id']));
// إذا كان الملف موجود ووقت انشاء الملف + الوقت الإضافي أكبر من الوقت حالياً، يعني أنه لا يزال الوقت الإضافي لم ينتهِ بعد.
// المقصود بالوقت الإضافي هو مثلاً ساعة من الوقت كما وضعتها في ملف الاتصال.
if( file_exists($cache.'news-0'.$id.'.html') && (filectime($cache.'news-'.$id.'.html')+$exp) > time() ){
// تضمين ملف الكاش وإظهاره كأن النتيجة من قاعدة البيانات
include($cache.'news-'.$id.'.html');
}else{
// إذا كان المتغير الذي يحمل رقم المقالات المخزنة في القاعدة لا يعمل، سنعرض آخر عشر عناوين من القاعدة.
if( !isset($id) ){
// طباعة آخر 10 مقالات
$query=mysql_query( "select from news limit 10");
// إذا كان جدول المقالات غير فارغ
if( mysql_num_rows( $query) > 0 ) {
while( $row=mysql_fetch_array($query) ){
echo $row['id']." رقم المقال";
echo $row['text']." نص المقال";
}
}else{
echo "لا توجد أي نتائج";
}
}else{
// طباعة المقال الذي حمل رقم
$query=mysql_query( "select from news where id='$id' ");
// إذا كان رقم المقال موجود في القاعدة أي توجد نتيجة أكبر من صفر
if( mysql_num_rows( $query) > 0 ) {
while( $row=mysql_fetch_array($query) ){
echo $row['id']." رقم المقال";
echo $row['news']." نص المقال";
}
}else{
echo "لا توجد أي نتائج";
}
}
$data=ob_get_contents(); // حفظ المعلومات المتدفقة في متغير
echo $data; // طباعة المحتوى
// هنا سنقوم بإنشاء أو تعديل ملف وحفظ معلومات المنتغير فيه $data
$fp=fopen($cache.'news-'.$id.'.html','w+'); // إنشاء الملف
fwrite($fp,$data); // الكتابة على الملف
ob_clean(); //مسح الذاكرة
}
?>


جزاك الله كل الخير ،، ونفع بك أستاذى
شرح رائع
رووووووووووعة الصراحة…
تسلم يالغالي
شكر