کش برای دستیابی به عملکرد بالا و مقیاس پذیری ضروری است. برای جلوگیری از تاخیر در APIها و کاهش زمان بارگذاری صفحه، اجرای استراتژی ذخیره سازی مناسب درست از مرحله توسعه بسیار مهم است. لاراول یکی از محبوبترین فریم ورکهای PHP است، بنابراین پیادهسازی استراتژی بهینه کش لاراول برای تجربه کاربری بهتر و تأثیر تجاری بیشتر ضروری است.
در این مقاله، استراتژیهای پیادهسازی و دستکاری کش در لاراول را بررسی میکنیم. با نحوه کار کش لاراول، چندین کوئری کش لاراول و نحوه مدیریت کش در اپلیکیشن های لاراول آشنا خواهید شد. اگر هنوز با ویژگی های لاراول 11 آشنا نیستید این مقاله را از دست ندهید.
چرا Caching مهم است؟
با رونق اخیر در کسب و کارهای اینترنتی، شرکتهای مختلف آماری دارند که نشان میدهد چگونه زمان بارگذاری وبسایت و عملکرد پایین میتواند تأثیر زیادی بر سئو، تعامل کاربر و نرخ مکالمه بدون ذخیرهسازی داشته باشد. و این با یک استراتژی کش عالی در محل شروع می شود.
یک مطالعه آنلاین نشان داد، "1 ثانیه زمان تاخیر بارگذاری، برای آمازون 1.6 میلیارد دلار در سال هزینه خواهد داشت."
مطالعه دیگری در گوگل گزارش داد: «تحقیق ما نشان میدهد که اگر نتایج جستجو حتی کسری از ثانیه کند شود، افراد کمتر جستجو میکنند (به طور جدی: تأخیر 400 میلیثانیه منجر به کاهش 0.44 درصدی حجم جستجو، طرفداران دادهها میشود). و این بی حوصلگی فقط به جستجو محدود نمی شود: از هر پنج کاربر اینترنت، چهار نفر اگر ویدیویی در حین بارگیری متوقف شود، کلیک می کنند.
کندی جزئی در زمان بارگذاری صفحه وب شما می تواند تأثیر زیادی بر تجربه کاربران شما و از دست دادن سرمایه در کل داشته باشد.
لاراول Caching چیست؟
لاراول یک پیاده سازی قوی و آسان برای استفاده از کش و متد های مختلف کش ارائه می دهد. با کش لاراول، می توانید به طور موثر بین بسیاری از موتورهای کش بدون نوشتن هیچ کدی جابجا شوید.
میتوانید پیکربندی کش لاراول را در پوشه config/cache.php
بیابید، اگرچه احتمالاً فقط به فایلenv.
برای جابهجایی بین روش های مختلف کش نیاز دارید.
کش لاراول همچنین روش های عملی زیادی را ارائه می دهد که می توانیم از آنها برای پیاده سازی استراتژی های مختلف کش استفاده کنیم، که در ادامه بررسی خواهیم کرد.
اعتبارسنجی در لارول یک گام خیلی بزرگ و مهمی است اگر می خوای با هنر اعتبارسنجی آشنا شوی این مقاله آنوفل را از دست نده!
درایورهای کش لاراول و مقایسه ها
کش لاراول در بک اند و درایورهای کش عالی را فراهم می کند. بسته به مورد استفاده خود، می توانید بین آنها جابجا شوید تا عملکرد برنامه و زمان بارگذاری خود را افزایش دهید.
همانطور که گفته شد، کش لاراول همچنین یک راه بیوقفه برای ایجاد یک بک اند سفارشی و استفاده از آن با کش لاراول ارائه میکند، اما تنها در صورتی که لیست زیر با موارد استفاده شما مطابقت نداشته باشد.
در ادامه در مورد لیست تمام درایور های کش backend ارائه شده توسط لاراول صحبت خواهیم کرد.
1.درایور فایل
درایور فایل به صورت پیشفرض توسط کش لاراول استفاده میشود، زمانی که هیچ درایوری در فایل env.
مشخص نشده باشد. درایور فایل برای ذخیره داده های ذخیره شده در یک فایل رمزگذاری شده در دایرکتوری storage/framework/
قرار داده شده است. لاراول یک فایل رمزگذاری شده با داده ها و کلید کش، زمانی که داده های جدید کش می شوند ایجاد می کند. هنگامی که کاربر در تلاش برای بازیابی محتوا است، همین اتفاق می افتد. کش لاراول کلید مشخص شده را در پوشه جستجو می کند و در صورت یافتن، محتوا را برمی گرداند.
اگرچه درایور فایل بدون نقص کار می کند و در زمان نصب و پیکربندی درایورهای خارجی صرفه جویی می کند، اما می تواند برای توسعه نیز عالی باشد. این سریعتر از دسترسی مستقیم به داده ها از سرور دیتابیس است.
برای استفاده از درایور فایل، کد زیر را به فایل env.
خود اضافه کنید:
CACHE_DRIVER=file
2. درایور آرایه
درایور آرایه یک سیستم کش کامل برای اجرای تست های خودکار است و به راحتی با Github Actions، Jenkins و غیره پیکربندی می شود.
درایور آرایه داده های کش شده را در یک آرایه در PHP ذخیره می کند و نیازی به نصب یا پیکربندی درایوری از شما ندارد. برای تستهای خودکار کاملاً کار میکند و کمی سریعتر از درایور کش فایل است.
برای استفاده از درایور آرایه، کد زیر را به فایل env.
خود اضافه کنید:
CACHE_DRIVER=array
برای آشنایی با تکنیک ها و بهترین روش های تست در لاراول این مقاله را از دست ندهید.
3.درایور دیتابیس
هنگام استفاده از درایور دیتابیس، داده ها برای فرآیند فعلی PHP در حافظه ذخیره می شوند. بنابراین، باید یک جدول دیتابیس برای ذخیره داده های کش شده ایجاد کنید. علاوه بر این، کش دیتابیس با توزیع بار کاری کوئری از بک اند به چند فرانت اند، مقیاس پذیری را بهبود می بخشد.
شما می توانید این دستور php artisan cache:table
را برای تولید خودکار جدول مورد نیاز درایور دیتابیس اجرا کنید. برای آشنایی با نوشتن دستورات در Artisan این مقاله را بررسی کنید.
درایور دیتابیس عمدتاً در شرایطی استفاده می شود که می توانید هر نرم افزاری را بر روی پلتفرم هاست خود نصب کنید.
به عنوان مثال، فرض کنید از یک طرح میزبانی رایگان با گزینه های محدود استفاده می کنید. برای این مورد، ما پیشنهاد میکنیم از درایور فایل استفاده کنید زیرا درایور دیتابیس در بیشتر موارد ضعیفترین نقطه برنامه شما است و تلاش برای وارد کردن دادههای بیشتر به آن گلوگاه ایده خوبی نیست.
برای استفاده از درایور دیتابیس، کد زیر را به فایل env. خود اضافه کنید:
CACHE_DRIVER=database
4. درایور Redis
درایور redis از فناوری کش مبتنی بر حافظه به نام Redis استفاده می کند. اگرچه در مقایسه با سایر درایورهای کش که در بالا توضیح داده شد، سریع است، اما نیاز به نصب و پیکربندی فناوری خارجی دارد.
برای استفاده از درایور redis، کد زیر را به فایل env.
خود اضافه کنید:
CACHE_DRIVER=redis
5. درایور Memcached
Memcached به عنوان محبوبترین سیستم کش مبتنی بر حافظه شناخته میشود. اگر کمی از نگهداری سرور اضافی (نیاز به نصب و نگهداری خدمات اضافی) ناراحت نیستید، درایورهای کش مبتنی بر مموری Memcached گزینه های خوبی هستند.
استفاده از درایور memcached مستلزم نصب پکیج Memcached PECL است.
برای استفاده از درایور memcached، کد زیر را به فایل env.
خود اضافه کنید.
CACHE_DRIVER=memcached
بهترین درایور کش برای استفاده و عملکرد درایور کش به مورد استفاده پروژه شما و مقدار داده ای که باید بازیابی شود بستگی دارد.
حالا که با همه درایور های کش در لاراول آشنا شدیم، بیاید با نحوه کش کردن داده ها و حذف و ویرایش آن آشنا شویم.
استفاده از کش لاراول و متد ها
کش لاراول متد های ارزشمندی را ارائه می دهد که برای اجرای بسیاری از استراتژی های کش استفاده می شود.
در زیر متد های مختلف را فهرست کردیم و در ادامه توضیح میدهیم (طبقهبندی شده بر اساس مورد استفاده):
put()
get()
many()
putMany()
increment()
decrement()
forever()
forget()
flush()
remember()
rememberForever()
ذخیره کش
ذخیره داده های جدید در کش با استفاده از روش های مختلف بسیار ساده است که هر کدام دارای چندین مورد استفاده هستند.
1. متد ()Cache::put
این متد سه پارامتر کلیدی، مدت زمان و داده هایی را که باید در کش ذخیره شوند، می پذیرد.
نحوه استفاده از متد ()Cache::put
:
Cache::put(key, data, duration)
$post = Post::find(1);
Cache::put('post_1', $post, 20);
کد بالا پست را با کلید منحصر به فرد به مدت 20 ثانیه کش می کند.
2. متد ()Cache::putMany
این متد آرایه ای از داده ها را به طور همزمان با مدت زمان مشابه در کش ذخیره می کند. دو پارامتر را می پذیرد که عبارتند از داده و ثانیه.
نحوه استفاده از متد ()Cache::putMany
:
Cache::putMany(data, duration) // syntax
$posts = Post::all();
Cache::putMany($posts, 20);
3. متد ()Cache::remember
این متد یک راه عالی دیگر برای پیاده سازی استراتژی Cache Aside است. متد ()Cache::remember
سه پارامتر، key
، duration
و closure
را می پذیرد که در صورت یافت نشدن، برای بازیابی داده ها از دیتابیس استفاده می شود.
نحوه استفاده از متد ()Cache::remember
:
Cache::remember(key, duration, closure) // syntax
Cache::remember('posts', 20, function(){
return Post::all();
});
کش لاراول متد ()Cache::rememberForever
نیز دارد که پارامتر seconds
را نمی پذیرد و داده ها را برای همیشه ذخیره می کند.
4. متد ()Cache::forever
این متد بدون تعیین مدت زمان، داده ها را برای همیشه در سرور کش ذخیره می کند. با کد زیر می توانید آن را پیاده سازی کنید:
نحوه استفاده از متد ()Cache::forever
:
Cache::forever(key, data)
$post = Post::find(1);
Cache::forever('post_1', $post);
بازیابی داده های کش
متد های این دسته داده ها را از کش بازیابی می کنند. برخی از این متد ها بسته به یافتن یا عدم یافتن دادهها میتوانند رفتار متفاوتی داشته باشند.
1. متد ()Cache::get
این متد داده ها را از سرور کش با یک کلید خاص بازیابی می کند. با استفاده از کد زیر می توانید یک مورد را بازیابی کنید:
Cache::get(key) // syntax
$posts = Cache::get('posts');
2. متد ()Cache::many
این متد شبیه به ()Cache::putMany
. برای بازیابی آرایه ای از داده های کش به طور همزمان با استفاده از آرایه ای از keys
کش استفاده می شود. با استفاده از کد زیر می توانید آرایه ای از کش را بازیابی کنید:
Cache::many(keys) // syntax
const $keys = [
'posts',
'post_1',
'post_2'
];
$posts = Cache::many($keys);
3. متد ()Cache::remember
همچنین می توانید از این متد برای بازیابی داده های کش شده با بررسی سرور کش با استفاده از key
ارائه شده استفاده کنید. اگر داده ها در کش ذخیره شوند، آن را بازیابی می کند. در غیر این صورت، داده ها را از سرور دیتابیس بازیابی می کند و آن را کش می کند. این متد همانند متد ()Cache::rememberForever
با یک پارامتر ثانیه اضافی در متد ()Cache::remember
است.
حذف موارد از کش
در این قسمت نیز بر اساس عملکرد، متد هایی که برای حذف موارد از کش است به صورت گروه بندی شده آمده است.
1. متد ()Cache::forget
این متد یک آیتم را با یک پارامتر کلیدی مشخص از کش حذف می کند:
Cache::forget('key');
2. متد ()Cache::flush
این متد تمام موتورهای کش را پاک می کند. تمام موارد ذخیره شده در هر جایی از کش را حذف می کند:
Cache::flush();
افزایش یا کاهش مقادیر کش
می توانید مقادیر یک مقدار صحیح ذخیره شده در کش خود را با استفاده از متد های افزایش و کاهش به ترتیب تنظیم کنید:
Cache::increment('key');
Cache::increment('key', $amount);
Cache::decrement('key');
Cache::decrement('key', $amount);
کش لاراول متد های بسیار خوبی دارد که در بالا به آنها اشاره نکردیم، اما متد های فوق محبوب هستند. شما می توانید یک نمای کلی از تمام متد ها در اسناد رسمی کش لاراول دریافت کنید.
20 تا از مهم ترین متد های الکونت لاراول که باید بدانید.
آشنایی با تست نویسی در لاراول با Pest
تزریق وابستگی و سرویس کانتینر در لاراول چیست؟
دستورات کش در Artisan
لاراول دستوراتی را ارائه می دهد تا کار با کش لاراول را آسان و سریع کند. در زیر لیستی از تمام دستورات و عملکردهای آنها آمده است.
کش لاراول را پاک کنید
این دستور برای پاک کردن کش لاراول حتی قبل از منقضی شدن آن با استفاده از ترمینال/کنسول استفاده می شود. برای مثال می توانید دستور زیر را اجرا کنید:
php artisan cache:clear
Route-Cache را پاک کنید
این دستور برای پاک کردن کش روت های برنامه لاراول شما استفاده می شود. برای مثال، دستور زیر را برای پاک کردن کش روت های خود اجرا کنید:
php artisan config:cache
پاک کردن فایل های view
کامپایل شده
این دستور برای پاک کردن فایلهای view
کامپایل شده برنامه لاراول شما استفاده میشود. با دستور زیر می توانید آن را اجرا کنید:
php artisan view:clear
جدول دیتابیس
هنگام استفاده از درایور دیتابیس، باید یک جدول دیتابیس به نام کش ایجاد کنید تا داده های کش را ذخیره کنید. همچنین می توانید از دستور Artisan برای ایجاد یک مایگرشن با اسکیمای مناسب استفاده کنید:
php artisan cache:table
استراتژی های کش لاراول
بسته به مورد استفاده برنامه و ساختار داده، چندین استراتژی کش مختلف احتمالاً در دسترس شما هستند. شما حتی می توانید یک استراتژی سفارشی متناسب با نیازهای خود ایجاد کنید. در زیر لیستی از استراتژی های کش محبوبی که می توانید در پروژه لاراول خود پیاده سازی کنید را مرور خواهیم کرد.
استراتژی writeThrough
در استراتژی writeThrough، سرور کش بین درخواستها و سرور دیتابیس قرار میگیرد و باعث میشود که هر عملیات نوشتن قبل از رفتن به سرور دیتابیس از طریق سرور کش انجام شود. بنابراین، استراتژی کش writeThrough مشابه استراتژی readThrough است.
می توانید این استراتژی را با کش لاراول با کد زیر پیاده سازی کنید:
public function writeThrough($key, $data, $minutes) {
$cacheData = Cache::put($key, $data, $minutes)
// Database Server is called from(after) the Cache Server.
$this->storeToDB($cachedData)
return $cacheData
}
private function storeToDB($data){
Database::create($data)
return true
}
استراتژی writeBack
این استراتژی یک راه پیشرفته تر برای اجرای استراتژی writeThrough با اضافه کردن تاخیرهای عملیات نوشتن است. شما همچنین می توانید این را استراتژی writeBehind بنامید به دلیل تاخیر در زمان اعمال شده بر روی سرور کش قبل از نوشتن داده ها در سرور دیتابیس.
می توانید این استراتژی را با کش لاراول با کد زیر پیاده سازی کنید:
$durationToFlush = 1; // (in minute)
$tempDataToFlush = [];
public function writeBack($key, $data, $minutes){
return $this->writeThrough($key, $data, $minutes);
}
public function writeThrough($key, $data, $minutes) {
$cacheData = Cache::put($key, $data, $minutes);
$this->storeForUpdates($cacheData);
return $cacheData;
}
// Stores new data to temp Array for updating
private function storeForUpdates($data){
$tempData = {};
$tempData['duration'] = this.getMinutesInMilli();
$tempData['data'] = data;
array_push($tempDataToFlush, data);
}
// Converts minutes to millisecond
private function getMinutesInMilli(){
$currentDate = now();
$futureDate = Carbon(Carbon::now()->timestamp + $this->durationToFlush * 60000)
return $futureDate->timestamp
}
// Calls to update the Database Server.
public function updateDatabaseServer(){
if($this->tempDataToFlush){
foreach($this->tempDataToFlush as $index => $obj){
if($obj->duration timestamp){
if(Database::create($obj->data)){
array_splice($this->tempDataToFlush, $index, 1);
}
}
}
}
}
متد writeBack
به متد writeThrough
فراخوانی میکند، که دادهها را در سرور کش و یک آرایه موقت ذخیره میکند تا بعداً با استفاده از متد updateDatabaseServer
به سرور دیتابیس ارسال شود. می توانید یک CronJob
راه اندازی کنید تا سرور دیتابیس را هر پنج دقیقه به روز کند.
استراتژی writeAround
این استراتژی به تمام عملیات نوشتن اجازه می دهد تا بدون به روز رسانی سرور کش، مستقیماً به سرور دیتابیس بروند، فقط در طول عملیات خواندن، سرور کش به روز می شود.
با فرض اینکه کاربر می خواهد یک مقاله جدید ایجاد کند، مقاله به طور مستقیم در سرور دیتابیس ذخیره می شود. هنگامی که کاربر می خواهد برای اولین بار محتوای مقاله را بخواند، مقاله از سرور دیتابیس بازیابی می شود و سرور کش را برای درخواست های بعدی به روز می کند.
می توانید این استراتژی را با کش لاراول با کد زیر پیاده سازی کنید:
public function writeAround($data) {
$storedData = Database::create($data);
return $storedData;
}
public function readOperation($key, $minutes){
$cacheData = Cache::remember($key, $minutes, function() {
return Article::all();
})
return $cacheData;
}
استرانژی Cache Aside (Lazy Loading)
دیتابیس در این استراتژی کنار گذاشته شده است و برنامه ابتدا اطلاعات را از سرور کش درخواست می کند. سپس، اگر پیدا شد، داده ها به کلاینت بازگردانده می شود. در غیر این صورت، اگر اشتباهی وجود داشته باشد (یافت نشد)، سرور دیتابیس داده ها را درخواست می کند و سرور کش را برای درخواست های بعدی به روز می کند.
می توانید این استراتژی را با کش لاراول با کد زیر پیاده سازی کنید:
public function lazyLoadingStrategy($key, $minutes, $callback) {
if (Cache::has($key)) {
$data = Cache::get($key);
return $data;
} else {
// Database Server is called outside the Cache Server.
$data = $callback();
Cache::set($key, $data, $minutes);
return $data;
}
}
کد بالا اجرای cache Aside Strategy را نشان می دهد که معادل پیاده سازی متد Cache::remember
است.
استراتژی Read Through
این استراتژی دقیقاً مخالف استراتژی Aside کش است. در این استراتژی، سرور کش بین درخواست کلاینت و سرور دیتابیس قرار می گیرد. درخواستها مستقیماً به سرور کش میروند و سرور کش در صورت عدم یافتن در سرور کش، مسئول بازیابی دادهها از سرور دیتابیس است.
می توانید این استراتژی را با کش لاراول با کد زیر پیاده سازی کنید:
public function readThrough($key, $minutes) {
$data = Cache::find($key, $minutes);
return $data;
}
private function find($key, $minutes){
if(Cache::has($key);){
return Cache::get($key);
}
// Database Server is called from the Cache Server.
$DBdata = Database::find($key);
Cache:put($key, $DBdata, $minutes);
return $DBdata;
}
اکنون در مورد چند استراتژی کش محبوب برای برنامه بعدی لاراول شما بحث کرده ایم. به یاد داشته باشید، حتی می توانید از یک استراتژی کش سفارشی استفاده کنید که به بهترین وجه با نیازهای پروژه شما مطابقت دارد.
نحوه پیاده سازی GraphQL در لاراول
کش کردن بخش رابط کاربری یک برنامه لاراول
کش کردن UI برنامه Laravel ما مفهومی است که به عنوان Full Page cache
FPC شناخته می شود. این اصطلاح به فرآیند کش کردن پاسخ HTML از یک برنامه اشاره دارد.
برای برنامه هایی که داده های پویا HTML اغلب تغییر نمی کنند بسیار عالی است. میتوانید پاسخ HTML را برای یک پاسخ کلی سریعتر و رندر کردن HTML ذخیره کنید.
می توانیم FPC را با خط کد زیر پیاده سازی کنیم:
class ArticlesController extends Controller {
public function index() {
if ( Cache::has('articles_index') ) {
return Cache::get('articles_index');
} else {
$news = News::all();
$cachedData = view('articles.index')->with('articles', $news)->render();
Cache::put('articles_index', $cachedData);
return $cachedData;
}
}
}
در نگاه اول، ممکن است متوجه شده باشید که ما بررسی می کنیم که آیا آن صفحه articles_index
از قبل در سرور کش ما وجود دارد یا خیر. سپس صفحه را با رندر کردن آن با متدهای ()view
و ()render
لاراول برمی گردانیم.
در غیر این صورت، صفحه را رندر می کنیم و خروجی را برای درخواست های بعدی قبل از بازگرداندن صفحه رندر شده به مرورگر در سرور کش ذخیره می کنیم.
نتیجه
ما استراتژیهای مختلفی را برای پیادهسازی و دستکاری کش لاراول بررسی کردهایم. شما همچنین یاد گرفته اید که چگونه از درایورها و متد های مختلف کش لاراول استفاده کنید. علاوه بر این، ما استراتژیهای مختلف کش را اجرا کردیم تا به شما کمک کنیم بفهمید کدام یک ممکن است برای شما مناسب باشد.
اگر هنوز در مورد کش لاراول سوالی دارید، لطفاً در بخش نظرات با ما در میان بگذارید.