مقدمة: لماذا التخزين المؤقت هو أساس أداء PHP
\n\nكل مطور PHP يواجه عاجلاً أم آجلاً مشكلة الأداء. بطء تحميل الصفحات، ارتفاع استهلاك ذاكرة الخادم، والطلبات المتكررة لقاعدة البيانات هي أعراض لغياب التخزين المؤقت الجيد. في تطوير الويب الحديث، التخزين المؤقت ليس ترفاً بل ضرورة. فبدونه، حتى الكود الأكثر تحسيناً سيبطئ تحت الأحمال العالية.
\n\nفي هذه المقالة، سنستعرض ثلاثة أساليب رئيسية للتخزين المؤقت في PHP: Redis وMemcached والحلول المدمجة (APCu وOPcache والتخزين المؤقت في الملفات). ستتعلم كيفية اختيار الأداة المناسبة لمهمة محددة، وسترى أمثلة عملية على الكود، وستحصل على توصيات عملية للتطبيق.
\n\n1. الحلول المدمجة في PHP: APCu وOPcache والتخزين المؤقت في الملفات
\n\n1.1. OPcache — تخزين مؤقت للبايت كود
\n\nOPcache هي آلية مدمجة في PHP تقوم بتجميع وحفظ البايت كود المُجمّع للنصوص البرمجية في الذاكرة. بدلاً من تحليل وتجميع ملف PHP في كل مرة، يستخدم OPcache النتيجة الجاهزة. وهذا يعطي زيادة في السرعة تصل إلى 30-50% دون كتابة سطر واحد من الكود.
\n\nالإعداد في php.ini:
\nopcache.enable=1\nopcache.memory_consumption=128\nopcache.interned_strings_buffer=8\nopcache.max_accelerated_files=10000\nopcache.revalidate_freq=2\n\nللتحقق من عمل OPcache استخدم الدالة:
\n<?php\nvar_dump(opcache_get_status());\n?>\n\n1.2. APCu — تخزين مؤقت للبيانات في الذاكرة
\n\nAPCu (Alternative PHP Cache) هي إضافة لتخزين البيانات العشوائية في الذاكرة المشتركة. مثالية لتخزين نتائج العمليات الحسابية الثقيلة، الإعدادات، أو البيانات التي نادراً ما تتغير.
\n\nمثال على التخزين المؤقت باستخدام APCu:
\n<?php\n// حفظ البيانات في الكاش لمدة 3600 ثانية (ساعة واحدة)\n$data = ['users' => 1500, 'status' => 'active'];\napcu_store('app_stats', $data, 3600);\n\n// القراءة من الكاش\n$cached = apcu_fetch('app_stats');\nif ($cached === false) {\n // البيانات غير موجودة في الكاش — نعيد حسابها\n $cached = computeExpensiveData();\n apcu_store('app_stats', $cached, 3600);\n}\n?>\n\n1.3. التخزين المؤقت في الملفات — بداية بسيطة بدون إضافات إضافية
\n\nإذا لم تكن هناك إمكانية لتثبيت Redis أو Memcached، استخدم نظام الملفات. هذا أبطأ، لكنه يعمل على أي استضافة.
\n\n<?php\nclass FileCache {\n private $cacheDir;\n \n public function __construct($dir = '/tmp/php_cache/') {\n $this->cacheDir = $dir;\n if (!is_dir($dir)) {\n mkdir($dir, 0777, true);\n }\n }\n \n public function get($key, $ttl = 3600) {\n $file = $this->cacheDir . md5($key) . '.cache';\n if (!file_exists($file)) return null;\n \n if (time() - filemtime($file) > $ttl) {\n unlink($file);\n return null;\n }\n \n return unserialize(file_get_contents($file));\n }\n \n public function set($key, $data) {\n $file = $this->cacheDir . md5($key) . '.cache';\n file_put_contents($file, serialize($data));\n }\n}\n\n// الاستخدام\n$cache = new FileCache();\n$result = $cache->get('expensive_query');\nif ($result === null) {\n $result = $db->query('SELECT ...');\n $cache->set('expensive_query', $result);\n}\n?>\n\n2. Memcached — تخزين مؤقت موزع للأحمال العالية
\n\n2.1. ما هو Memcached ومتى يتم استخدامه
\n\nMemcached هو نظام تخزين مؤقت موزع في الذاكرة العشوائية. يعمل وفق مبدأ key-value وهو مثالي لتخزين نتائج استعلامات SQL وجلسات المستخدمين وأجزاء HTML. المزايا الرئيسية:
\n- \n
- سهولة التثبيت والإعداد \n
- سرعة عالية