لماذا cashing مهم؟
إذا كان عندك بيانات تتكرر كثيراً (مثل قائمة المنتجات، أو بيانات المستخدم، أو إعدادات التطبيق)، مش لازم كل مرة تروح تجيبها من الـ Database. استخدم Cache لتخزينها في الذاكرة!
Laravel يدعم عدة Cache Drivers لتناسب احتياجات مختلفة:
Redis هو الخيار الأمثل للتطبيقات في مرحلة الإنتاج - سريع جداً، يدعم أنواع بيانات متقدمة، ويمكن استخدامه أيضاً للـ Queue والـ Session.
bash# تثبيت Redis composer require predis/predis
env# في .env CACHE_DRIVER=redis REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 phpuse Illuminate\Support\Facades\Cache;
// تخزين بيانات في الـ Cache
Cache::put('products', $products, now()->addHours(1));// استرجاع بيانات من الـ Cache
$products = Cache::get('products');
// Cache with remember (الأكثر استخداماً)
$products = Cache::remember('products', 3600, function () {
return Product::with('category')->active()->get();
});
// تخزين دائم
Cache::forever('settings', $settings);
// حذف من الـ Cache
Cache::forget('products');
// مسح كل الـ Cache
Cache::flush();مناسب اذا كانكنت تحتاج فقط ل simple key-value caching، فهو بديل خفيف وسريع ل Redis
bash# تثبيت Memcached PECL extension sudo apt-get install memcached sudo apt-get install php-memcached
env CACHE_DRIVER=memcached MEMCACHED_HOST=127.0.0.1 MEMCACHED_PORT=11211
env CACHE_DRIVER=file
⚠️ ملاحظة: File cache غير مناسب للإنتاج لأنه بطيء نسبياً ولا يدعم الـ distributed caching.
Cache Tags (للتنظيم الأفضل)
php// تخزين مع tags
Cache::tags(['products', 'category:' . $categoryId])
->put('products:category:' . $categoryId, $products, 3600);
// استرجاع
$products = Cache::tags(['products', 'category:' . $categoryId])
->get('products:category:' . $categoryId);
// حذف كل cache items لـ tag معين
Cache::tags('products')->flush();⚠️ تنبيه مهم: Cache tags تعمل بشكل أفضل مع Memcached. مع Redis قد تواجه مشاكل في الأداء.
Query Result Caching
php// في Model
public function scopePopular($query)
{
return Cache::remember('popular_products', 3600, function () use ($query) {
return $query->where('views', '>', 1000)
->orderBy('views', 'desc')
->limit(10)
->get();
});
}
// الاستخدام
$popularProducts = Product::popular()->get();php// في Controller
public function index()
{
return Cache::remember('api.products.index', 600, function () {
$products = Product::with('category')->paginate(20);
return response()->json([
'data' => $products,
'cached_at' => now()
]);
});
}Cache Invalidation عند التحديث
php// في Observer أو Event Listener
class ProductObserver
{
public function saved(Product $product)
{
// حذف الـ cache عند حفظ منتج
Cache::forget('products');
Cache::forget('popular_products');
Cache::tags('products')->flush();
}
public function deleted(Product $product)
{
Cache::forget('products');
}
}✅ سرعة فائقة: تقليل زمن الاستجابة من ثواني إلى ميلي ثانية
✅ تقليل الحمل: يوفر 70-90% من الاستعلامات على قاعدة البيانات
✅ قابلية التوسع: يمكن خدمة آلاف المستخدمين بنفس موارد السيرفر
✅ توفير التكاليف: تقليل استهلاك CPU والـ Database