أهلاً بيك يا صديقي المبرمج في مقال جديد. خلينا نتفق في البداية على حاجة: كلنا كـ مبرمجين ويب (Web Developers) بيقابلنا المشكلة دي، لما السيرفر يبدأ يبطئ، والـ Database تقعد تلف وتدور عشان تطلع البيانات، واليوزر زهقان وقاعد بيبص على شاشة التحميل. هنا بيجي دور البطل الخارق: التخزين المؤقت (Caching).
الموضوع مش بس إنك تستخدم أداة جاهزة وخلاص، الأجمل إنك تفهم "إحساس" البرمجة من وراء الكواليس وتبني نظام Caching بنفسك من الصفر بـ لغة PHP الصافية (Vanilla PHP) من غير ما تعتمد على إطارات عمل (Frameworks) تداري عنك الشغل الحقيقي. في المقال ده، هنعرف مع بعض إزاي نبني نظام Caching محترم باستخدام الملفات (File-based Caching) وتطويره عشان يشتغل مع (Redis) لو حبت تطور المشروع قدام.
Table of contents [Show]
إيه هو الـ Caching وليه أصلاً بنحتاجه؟ (What is Caching)
تخيل إنك فاتح محل كشري، وكل ما زبون يطلب طبق، تدخل المخزن وتطحن الغلة وتعمل الصلصة من أول وجديد. طبعاً الزبون هيموت من الجوع! الصح إنك بتجهز الحاجات دي وتخليها جاهزة (مخزنة) عشان تطلع في ثواني.
ده بالضبط اللي بيعمله الـ Caching في الـ (Web Development). بدل ما الـ PHP كل شوية تبعت Query تقيلة للـ Database عشان تجيب بيانات بتتحدث كل فين وففين (زي قائمة الأقسام، أو الإعدادات العامة للموقع)، إحنا بنحفظ النتيجة دي في مكان سريع الوصول ليه (زي هارد ديسك السيرفر أو الذاكرة العشوائية RAM).
تصميم فكرة الـ File-based Caching في PHP
عشان نعمل نظام Caching بسيط باستخدام الملفات، الفكرة ببساطة بتعتمد على 3 حاجات رئيسية:
- مكان الحفظ: مجلد معين على السيرفر هنخزن فيه الملفات (Storage Directory).
- مدة الصلاحية (TTL - Time To Live): امتى البيانات دي تفقد صلاحيتها وتعتبر قديمة؟
- المفتاح والقيمة (Key-Value Pair): كل داتا ليها اسم مميز (Key) بنعرف نجيبها بيه.
كود البداية: بناء كلاس الـ Cache بالملفات
تعالوا نكتب كلاس (Class) بـ PHP نعمل بيه حفظ واسترجاع للبيانات بكل سهولة من غير أي تعقيد:
<?php
class FileCache {
private $cacheDir;
public function __construct($dir = __DIR__ . '/cache') {
$this->cacheDir = $dir;
if (!is_dir($this->cacheDir)) {
mkdir($this->cacheDir, 0755, true);
}
}
private function getFilePath($key) {
return $this->cacheDir . '/' . md5($key) . '.cache';
}
public function set($key, $data, $ttl = 60) {
$filePath = $this->getFilePath($key);
$cachedData = [
'expires' => time() + $ttl,
'data' => $data
];
file_put_contents($filePath, serialize($cachedData));
}
public function get($key) {
$filePath = $this->getFilePath($key);
if (!file_exists($filePath)) {
return null;
}
$cachedData = unserialize(file_get_contents($filePath));
if ($cachedData['expires'] < time()) {
unlink($filePath); // اذفن الملف لو انتهت صلاحيته
return null;
}
return $cachedData['data'];
}
public function clear() {
$files = glob($this->cacheDir . '/*');
foreach ($files as $file) {
if (is_file($file)) {
unlink($file);
}
}
}
}
?>
ازاي تستخدم الكلاس ده في مشروعك العملي؟
الاستخدام أبسط مما تتخيل. تعال نفترض إننا عايزين نجيب بيانات تقيلة من الـ Database ونخزنها لمدة 5 دقائق (300 ثانية):
<?php
require_once 'FileCache.php';
$cache = new FileCache();
$cacheKey = 'latest_users_list';
// جرب تسحب البيانات من الكاش الأول
$users = $cache->get($cacheKey);
if ($users === null) {
// لو مش موجودة في الكاش، هاتها من الداتا بيز
// $users = $db->query("SELECT * FROM users")->fetchAll();
// محاكاة لبيانات جاية من الداتا بيز
$users = ['أحمد', 'محمد', 'محمود'];
// احفظ البيانات في الكاش لمدة 5 دقايق
$cache->set($cacheKey, $users, 300);
echo "(جاي من الـ Database مباشرة)
";
} else {
echo "(جاي من الـ Caching السريع يا فنان)
";
}
echo "<pre>";
print_r($users);
echo "</pre>";
?>
التطور الطبيعي: الانتقال إلى Redis
لما مشروعك يكבר ويزيد عدد الزوار (High Traffic)، استخدام ملفات الهارد ديسك (File System) ممكن يبطئ السيرفر بسبب عمليات الكتابة والقراءة الكتيرة (I/O Operations). هنا بيجي دور الـ (Redis)، وهو نظام تخزين مؤقت بيعتمد بالكامل على الذاكرة العشوائية (In-memory data structure store).
عشان تربط PHP مع Redis، بتستخدم الـ Extension الرسمية، وبيكون الكود متشابه جداً في الفكرة لكن أسرع بكتير جداً في الأداء:
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'site_statistics';
$data = $redis->get($key);
if (!$data) {
// حسابات معقدة أو استعلامات تقيلة
$data = "بيانات الإحصائيات الضخمة";
$redis->setex($key, 600, $data); // تخزين لمدة 10 دقائق
}
echo $data;
?>
خاتمة ونصيحة من أخ
يا صديقي، فهمك لـ طريقة عمل الـ Caching من تحت الفلتر بيفرق جداً في مستواك وبيخليك مبرمج فاهم مش مجرد كاتب أكواد وخلاص. متخافش تغلط وتبني أدواتك بنفسك، لأن العك ده هو اللي بيصنع المهندس الشاطر. ابدأ بالملفات، وبعدين جرب الـ Redis، وحسّن أداء مشاريعك خطوة بخطوة.