افزایش 5 برابری سرعت لاراول با کش LiteSpeed

نوعی از کش در وب سرور وجود دارد که به آن web cache (HTTP cache) می گویند که خروجی نهایی یک آدرس را ذخیره می کند و در پاسخ به درخواست هایی بعدی که برای آن آدرس ارسال می شود، نسخه ذخیره شده را برای کلاینت ارسال می کند.با این کار عملا اسکریپت php به طور کلی اجرا نشده و باعث صرفه جویی در منابع سرور و همچنین افزایش سرعت پاسخ گویی سرور می شود.که از انواع آن می توان به varnish ، litespeed cahce ، apache mod_cache و .... اشاره کرد.که باتوجه به بررسی های انجام شده سرعت ، عملکرد و راحتی کار litespeed هر چند کم اما نسبت به رقبا بهتر است .پس تصمیم گرفتم نحوه کانفیگ lscache یا همان litespeed cahce برای لاراول توضیح دهم.باید دقت داشته باشید از آن جایی که در این روش کل خروجی صفحه کش می شود پس برای صفحاتی که دیتا و خروجی آن ، برای هر کاربر متفاوت است مانند پنل مدیریت (ادمین، کاربر) قابل استفاده نیست بلکه برای صفحاتی که اطلاعات آن برای تمامی کاربران یکسان است مانند پست یک وب سایت خبری یا صفحه محصولات یک فروشگاه قابل استفاده است.پس شما باید تک تک صفحات وب سایت خود را کانفیگ کنید که کدام یک کش شود و کدام یک نشود.این کار را می توانید با استفاده از هدر هایی که خود وب سرور مشخص کرده است انجام دهد مانند مثال زیر:header('X-LiteSpeed-Cache-Control: esi=on');اما تعیین تک تک صفحات با قرار دادن headerکار عاقلانه ای نیست و باعث ایجاد پیچیدگی در کد و سخت شدن مدیرت کش صفحات وب سایت ما می شود.پس برای جلوگیری از این کار از کتابخانه litespeedtech/lscache-laravel که به صورت رسمی توسط شرکت litespeed برای لارول نوشته شده است استفاده می کنیم.دقت داشته باشید توضیحات زیر برای لارول نسخه 7 به بالا می باشد.برای نصب ابتدا دستور زیر را در ترمینال اجرا کرده تا پکیج در لارول نصب شود:composer require litespeed/lscache-laravelبعد از کامل شدن نصب با استفاده از دستور زیر فایل کانفیگ lscache را ساخته و در پوشه config قرار می گیرد.php artisan vendor:publish --provider=&quotLitespeed\LSCache\LSCacheServiceProvider&quotحال به برای کانفیگ کردن به config/lscache.php رفته و باتوجه به توضیحات زیر lscache را کانفیگ کنید.lscache.phpشماره 1 : ESIتصور کنید می خواهید صفحه اخبار از یک سایت خبری را کش کنید مشکلی که دارید این است که متن خبر ثابت است اما ساید بار های سایت دائما در حال تغییر است و با کش کردن کل صفحه عملا ساید بار ها ثابت خواهد ماند. با فعال کردن ESI شما می توانید با قرار دادن تگ زیر به lscache بگویید که محتوی این قسمت را از آدرسی دیگر که کش شده نیست لود کن.<esi:include src=&quothttp://example.com/sidebar1&quot />در این روش شما تگ های html قسمت های از سایت که دائما در حال تغییر هستند را از سورس آن صفحه حذف کرده به جای آن با قرار دادن تگ بالا به وب سرور می گویید که هنگام نمایش صفحه به جای تگ <esi:include آدرس src فراخوانی و خروجی آن را در آن قسمت جایگزین کند.به عبارت دیگر آن قسمت ها مثل سایت بار سایت در یک آدرس دیگر تولید می شوند و بعدا در صفحه اینجکت می شوند.اگر می خواهید از چنین قابلیتی استفاده کنید ESIرا برابر true قرار دهد.شماره 2 : LSCACHE_DEFAULT_TTLمدت زمانی که کش در وب سرور نگه داری می شود که به ثانیه است ، سعی کنید مقدار بالایی قرار دهد 1 روز به بالاشماره 3 : LSCACHE_DEFAULT_CACHEABILITYنحوه ذخیره سازی cache است که شامل private, no-cache, public , no-vary اpublic برای زمانی است که می خواهید صفحه را برای همه به یک شکل نشان دهید.اprivate برای زمانی است که می خواهید صفحه را برای کاربر یا کاربران خاص با توجه با IP یا session و... آنها نمایش دهید.اno-cache برای زمانی است که می خواهید به طور پیش فرض هیچ صفحه ای کش نشود.پیشنها می شود LSCACHE_DEFAULT_CACHEABILITY به صورت پیش فرض بر روی no-cache قرار دهید. بعدا در Middleware تظیمات لازم را انجام می دهیم.شماره 4 : LSCACHE_GUEST_ONLYبا true قرار دادن مقدار LSCACHE_GUEST_ONLY کش برای کاربران که در سایت لاگین کرده اند غیرفعال می شود.شما می توایند تنظیمات را درون فایل env. نیز قرار دهید.فعال سازی کشبرای فعال سازی کش کد زیر را درون فایل قرار دهید.<IfModule LiteSpeed> CacheLookup on </IfModule>هر زمان که نیاز به کش نداشتید با off کردن CacheLookup به راحتی و بدون هیچ دردسری کش غیرفعال می شود.تظیمات کش در middlewareحا شما با توجه ساختار وب سایت خود می تواند صفحات را با قرار دادن lscache middleware کش کنید.Route::get('/blog', function() { return view('blog'); })->middleware('lscache:max-age=10;private;esi=on');پاکسازی کش(purge)تصور کنید در پنل ادمین تغییراتی را در پست سایت خود اعمال می کنید ، شما باید پس از اعمل تغییرات ،کش آن صفحه را پاک کنید تا تغییرات جدید در صفحه اعمال شود برای این کار می توانید در controller خود پس از ذخیره سازی تغییرات در مدل ، کش آن آدرس را پاکسازی (purge) کنید.<?php namespace App\Http\Controllers; use LSCache; class BlogController extends BaseController { // Your article logic here LSCache::purge('/address_of_page'); }اما اگر محتوی شما در قسمت های مختلفی از کد شما تغییر می کند و برای پاک سازی کش نیاز به اضافه کردن کد بالا در چندجا هستید ، شما می توانید کش را در متد boot() مدل (model) و یا در Observersپاک کنید.class User extends Model { public static function boot() { parent::boot(); self::updated(function($model){ LSCache::purge('/address_of_page'); }); } }همچنین برای پاک کردن کلیه کش ها از دستور زیر استفاده کنید.LSCache::purgeAll(); احراز هویت Authenticationاگر در تنظیمات گزینه LSCACHE_GUEST_ONLY را برابر true قرار دهید برای این که کش برای کاربران لاگین کرده غیرفعال شود کد زیر را درون htaccess. خود قرار دهید.RewriteEngine On RewriteRule .* - [E=Cache-Vary:Authorization]برای اطمینان از فعال بودن کش هدر ریسپانس وب سایت خود را بررسی کنید.مقدار x-litespeed-cache باید برابر hit باشد.دقت داشته باشد cache-control مربوط به کش مرورگر (browser caching) است و ارتباطی با کش litespeed ندارد.