وبلاگ

کش کردن کوئری‌های الوکوئنت در لاراول


رقیه اباذری رقیه اباذری

وقتی صحبت از سرعت سایت و اپلیکیشن می‌شود، کش می‌تواند بهترین گزینه باشد. کش کردن تاثیر زیادی در سرعت سایت دارد. خوشبختانه لاراول به صورت از پیش نصب شده درایورهای کش دارد که بدون هیچ زحمتی می‌توانید از آنها استفاده کرده و سرعت سایت را بهبود ببخشید. Redis و Memcached یا تنها استفاده از فایل‌های لوکال، لاراول همه اینها را دارد.

در این مقاله پیاده سازی کش برای کوئری‌های الوکوئنت به صورت مستقیم از لاراول را بررسی می‌کنیم، که کش در دیتابیس را ساده می‌سازد.

نصب و راه اندازی 

پکیج را می‌توانید از طریق کامپوزر نصب کنید:

composer require rennokki/laravel-eloquent-query-cache

مدل‌های شما به تریت QueryCacheable نیاز دارند:

use Rennokki\QueryCache\Traits\QueryCacheable;
class Article extends Model
{
    use QueryCacheable;
    ...
}

کش را به صورت پیش فرض فعال کنید

پکیج به صورت پیش فرض کش را فعال نمی‌کند. پراپرتی cacheFor$ را به مدل اضافه کنید:

use Rennokki\QueryCache\Traits\QueryCacheable;
class Article extends Model
{
    use QueryCacheable;
    protected $cacheFor = 180; // 3 minutes
}

هر وقت که یک کوئری اجرا شود، کش وارد عمل می‌شود. در صورت خالی بودن کش برای آن کوئری، آن را ذخیره می‌کند و دفعه بعد آن را از کوئری دیتابیس که کش شده، بازیابی می‌کند.

در صورت وجود داشتن آن را بازیابی کرده و به کار می‌گیرد. این عمل را بدون اینکه با دیتابیس کاری داشته باشد انجام می‌دهد.

// database hit; the query result was stored in the cache
Article::latest()->get();
// database was not hit; the query result was retrieved from the cache
Article::latest()->get();

چنانچه می‌خواهید از استفاده از کش جلوگیری کنید، از متد ()dontCache-> قبل از تریگر کردن متد آخر استفاده کنید.

Article::latest()->dontCache()->firstOrFail();

فعال کردن کش به صورت کوئری به کوئری

اگر فعال کردن کش به صورت پیش‌فرض، راه حل مناسبی برای شما نیست، روشی جایگزین را انتخاب کنید. فعال کردن کش به صورت کوئری به کوئری یعنی هر بار که کوئری می‌نویسد باید آن را کش کنید که در مقابل روش اول یعنی کش کردن تمامی کوئری‌های مدل است.

اول از همه، متغیر cacheFor$ را از مدل حذف کنید. در هر کوئری با فراخونی (...)cacheFor->  مشخص می‌کنید که قصد کش کردن آن کوئری را دارید.

Article::cacheFor(now()->addHours(24))->paginate(15);

با تگ‌ها بهتر سازماندهی کنید

بعضی از ذخیره سازهای کش مثل Redis یا Memcached از تگ زدن کلیدها پشتیبانی می‌کنند. این ویژگی از این منظر خیلی مفید است که کوئری کش شده را تگ می‌زنیم و هر وقت که بخواهیم کش مورد نظرمان را غیرفعال می‌کنیم. 

به عنوان مثال ساده، اگر بخواهیم با آپدیت کردن یک مقاله، کش لیست مقاله‌ها را پاک کنیم، استفاده از تگ روش کارآمدی است.

$articles = Article::cacheFor(60)->cacheTags(['latest:articles'])->latest()->get();
$article = Article::find($id);
$article->update(['title' => 'My new title']);
Article::flushQueryCache(['latest:articles']);

متد flushQueryCache فقط کش تگ شده با latest:articles را پاک می0157کند. اگر کوئری‌های دیگر با تگی به جز latest:articles تگ شده باشند در کش نگه داشته می‌شوند.

 

 

 

 

 

 

 

 



رقیه اباذری
رقیه اباذری

تو دانشگاه IT خوندم و اکثر منابع کتاب‌های ترجمه شده بودند و صدالبته مبهم :( مثلا element رو "عنصر" ترجمه می‌کردن و من همیشه می‌رفتم تو شیمی و جدول مندلیف. تو باورژن سعی کردم تا حد ممکن مطالب رو با زبان ساده و قابل درک بنویسم. باشد که کسانی که تازه پا به عرصه برنامه‌نویسی گذاشتن، راغب‌تر بشن و با نظرات و فیدبک‌های شما راه هموارتر بشه:)

مطالب مرتبط

مزایای منحصر به فرد استفاده از فریمورک لاراول

خدمات توسعه لاراول، جامعه PHP را غافلگیر کرده است. به جرات می‌توان گفت لاراول یکی از بهترین‌ فریمورک‌های PHP است که کار برنامه‌نویسی و کدزدن را سرعت بخشیده است. حتی ارتقا و توسعه هم با لاراول راحت‌تر شده است. به طوریکه توسعه برنامه به جای خسته‌کننده بودن، تبدیل به کاری جذاب و خلاقانه شده است.

آموزش متد filter کالکشن در لاراول به همراه مثال

قبل از شروع معرفی متد فیلتر، بهتر است بدانیم کالکشن چیست؟ متد filter کالکشن، همانطور که از نام آن پیداست، کار فیلتر را انجام می دهد. اما خب به چه صورت؟!

کلاس‌های تک اکشن در کنترلر لاراول

فانکشن‌های جادویی در PHP وجود دارد که __invoke یکی از آن‌هاست. از طریق متد __invoke، فقط با یک فانکشن __invoke کلاس‌هایی را ایجاد می‌کنیم و هر زمان که آبجکت آن‌ها فراخوانی شود، مستقیماً متد __invoke را فراخوانی می‌کند. پس دیگر نیازی نیست به‌صورت دستی $obj->someFunction() را بنویسید.

بهترین پکیج‌های لاراول

به عنوان یک توسعه‌دهنده PHP، باید با نحوه استفاده از فریمورک‌ها آشنا باشید. فریمورک‌ها با ساده‌سازی روش‌های رایج مورد استفاده در توسعه پروژه‌های بزرگ وب مانند پکیج‌ها، ماژول‌ها، افزونه‌ها و حتی کامپوننت‌ها، سعی دارند روند توسعه را آسان کنند. اگر با لاراول کار می‌کنید پیشنهاد می‌کنم این مقاله درباره بهترین پکیج‌های لاراول را حتما مطالعه کنید.

دیدگاه‌ها