بسم الله الرحمن الرحيم
###########
لماذا الملفات المؤقتة
الملفات المؤقتة ضرورة لكل برنامج يزوره الزوار بكثرة حيث يقوم بتخفيف الضغط عن القاعدة
وهنا اتكلم عن برنامج يجلب البيانات من القاعدة
تصور ان يكون لديك برنامج مقالات يقوم بالاتصال بالقاعدة واستخراج عشر نتائج في الصفحة
وتصور ايضاان يكون عدد الزوار مثلا مائة
اذا مائة اتصال في اللحظة الواحدة بالاضافة اذا كانت لديك اتصالات اخرى مع القاعدة لجلب معلومات اخرى
مثل اعدادات الموقع والأقسام ووو
المهم فكرة الملفات المؤقتة هي
عند جلب البيانات من القاعدة تقوم بحفظ المخرجات في متغير وتقوم بارساله الى ملف مؤقت يتم انشائه اليا
ويتم طباعة المتغير في الصفحة كأنه لم يتم اي شيء
ولكن الزائر الثاني والثالث والسبعة وتسعون الأخرون سيتم اظهار لهم الملف المؤقت
##############
فوائد الملفات المؤقتة
بكل صراحة ستجد فرق كبير بين الوضع السابق والأن
بالطبع سيكون البرنامج سريع التصفح
###########
الدوال التي سنحتاجها في الدرس وهي
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
كود PHP:
<?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
كود PHP:
<?php
// سأقوم بتغير الوجهة بسرعة الى ملف العرض طبعا هذه الملفات للتجربة فقط
header("location: news.php");
?>
#########
عندما نضيف بيانات الى القاعدة
سنستخدم ملف moderator.php
كود PHP:
<?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
كود PHP:
<?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']." رقم المقال <br />";
echo $row['text']." نص المقال <br />";
}
}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']." رقم المقال <br />";
echo $row['news']." نص المقال <br />";
}
}else{
echo "لا يوجد اي نتائج";
}
}
$data=ob_get_contents(); // حفظ المعلومات المتدفقة في متغير
echo $data; // طباعة المحتوى
// هنا سنقوم بانشاء او تعديل ملف وحفظ فيه معلومات المنتغير $data
$fp=fopen($cache.'news-'.$id.'.html','w+'); // انشاء الملف
fwrite($fp,$data); // الكتابة على الملف
ob_clean(); //مسح الذاكرة
}
?>
والحمد لله على اكمال الدرس
والسلام عليكم