اذهب إلى المحتوى

السؤال

نشر (معدل)

عندما أقوم بعمل إستعلام لجلب عدد من المستخدمين على سبيل المثال فإن لارافيل Laravel يقوم بتنفيذ إستعلام SQL في قاعدة البيانات في كل مرة، وهذا الأمر يجعل الصفحة بطيئة بعض الشيء.

هل توجد طريقة لتخزين نتائج الإستعلامات بشكل سهل في لارافيل Laravel أم يجب أن أستعمل قاعدة بيانات مثل Redis؟

تم التعديل في بواسطة Emad Saif

Recommended Posts

  • 1
نشر

يمكنك استخدام قاعدة البيانات نفسه كدرايفر تخزين مؤقت لنتائج هاته الاستعلامات. 

اعداد قاعدة البيانات لتكون دريفر تخزين مؤقت تكون عن طريق اسناد القيمة database للمتغير CACHE_DRIVER في ملف متغيرات البيئة env.

CACHE_DRIVER=database

استعن بالامر:

php artisan cache:table

لإنشاء ملف تهجير يخص جدولي التخزين المؤقت في قاعدة البيانات. يكونان باسم cache و cache_locks

بعد هذا ستحتاج البدء في استخدامه بشكل عادي. فبدل اعاد الاستعلام كل مرة كـ:

public function index()
{
   $data = [
      'latest_articles' => Article::orderBy('id' ,'desc')->limit(10)->get(),
      'popular_articles' => Article::orderBy('stars' ,'desc')->limit(10)->get(),
      'starred_categories' => Category::where('starred' ,true)->get(),
      'latest_comments' => Comment::orderBy('id' ,'desc')->limit(10)->get(),
   ];

   return view('yourview' ,compact('data'));
}

نقوم بـ:

public function index()
{
   $data = null;

   // التحقق من ما ان لم يتم من قبل تخزين هذا المفتاح مؤقتا
   if (!Cache::has('my_data_key')) {
       // اعادة الاستعلام
       $d = [
         'latest_articles' => Article::orderBy('id' ,'desc')->limit(10)->get(),
         'popular_articles' => Article::orderBy('stars' ,'desc')->limit(10)->get(),
         'starred_categories' => Category::where('starred' ,true)->get(),
         'latest_comments' => Comment::orderBy('id' ,'desc')->limit(10)->get(),
       ];
       
       // وضع نتائج الاستعلام في التخزين المؤقت
       Cache::put('my_data_key', $d , now()->addMinutes(180));
       $data = $d;
   }
   else{
     // جلب البيانات من التخزين المؤقت
     $data = Cache::get('my_data_key');
   }

   return view('yourview' ,compact('data'));
}

او لننظم العملية اكثر فتصبح:

/**
* عرض الصفحة الرئيسية للموقع 
*
* @return \Illuminate\Http\Response
*/
public function index()
{
   $data = $this->loadData();

   return view('yourview' ,compact('data'));
}

/**
* تحميل البيانات من التخزين المؤقت 
* او اعادة تخزينها
*
* @return array
*/
private function loadData()
{   
   if (!Cache::has('my_data_key')) 
       Cache::put('my_data_key', $this->queryDataFromDB() , now()->addMinutes(180));
   

   return Cache::get('my_data_key');
}

/**
* تنفيذ استعلامات قواعد البيانات
* المحددة
*
* @return array
*/
private function queryDataFromDB()
{
    return [
         'latest_articles' => Article::orderBy('id' ,'desc')->limit(10)->get(),
         'popular_articles' => Article::orderBy('stars' ,'desc')->limit(10)->get(),
         'starred_categories' => Category::where('starred' ,true)->get(),
         'latest_comments' => Comment::orderBy('id' ,'desc')->limit(10)->get(),
    ];
}

التخزين المؤقت (Cache) في Laravel

استفد اكثر من هاته الاجابة

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...