تخمین زده می شود که ۴۰٪ از مردم زمانی که بارگذاری یک وب سایت بیش از ۳ ثانیه طول بکشد، آن را ترک می کنند! بنابراین، از نظر کسب و کار بسیار مهم است که مطمئن شوید زیر آن آستانه ۳ ثانیه ای میتوانید وب سایت خود را به افراد نشان دهید. بنابراین، هر زمان که برای پروژههای لاراول جدیدم کدی مینویسم، سعی میکنم تا جایی که میتوانم کد را در محدودیتهای زمانی و هزینهای که دارم بهینه کنم.
اگر روی پروژههای موجود کار میکنم، سعی میکنم از این تکنیکها برای بهروزرسانی کدهای کند در حال اجرا برای بهبود تجربه کلی برای کاربران استفاده کنم. در زیر به برخی از تکنیکها برایسرعت سایت لاراول اشاره کرده ام که میتوانید مشاهده کنید:
۱. فقط فیلدهایی را که در جستارهای پایگاه داده خود نیاز دارید واکشی کنید
یکی از راه های آسان برای افزایش سرعت سایت لاراول، کاهش حجم داده های انتقال یافته بین اپلیکیشن و پایگاه داده است. راهی که میتوانید این کار را انجام دهید این است که تنها ستونهایی را که در جستارهای خود به آن نیاز دارید، واکشی کنید.
به عنوان مثال، فرض کنید یک مدل User دارید که شامل ۲۰ فیلد مختلف است. حال، تصور کنید که شما ۱۰۰۰۰ کاربر در سیستم خود دارید و سعی می کنید هر یک از آنها را به نوعی پردازش کنید. کد شما ممکن است چیزی شبیه به این باشد:
$users = User::all();
foreach($users as $user) {
// Do something here
}
پرس و جوی فوق مسئول بازیابی ۲۰۰۰۰۰ فیلد داده است. اما، تصور کنید که وقتی هر کاربر را پردازش میکنید، فقط از فیلدهای id، first_name و last_name استفاده میکنید. بنابراین، این بدان معنی است که از ۲۰ فیلدی که بازیابی می کنید، ۱۷ مورد از آنها برای این قطعه کد خاص کم و بیش اضافی هستند.
بنابراین، کاری که میتوانیم انجام دهیم این است که فیلدهایی را که در کوئری برگردانده میشوند، بهصراحت تعریف کنیم. در این مورد، کد شما ممکن است چیزی شبیه به این باشد:
$users = User::select([‘id’, ‘first_name’, ‘last_name’])->get();
foreach($users as $user) {
// Do something here
}
با این کار مقدار فیلدهای برگشتی در کوئری را از ۲۰۰۰۰۰ به ۳۰۰۰۰ کاهش خواهیم داد. اگرچه این احتمالاً تأثیر زیادی بر بارگذاری IO پایگاه داده نخواهد داشت، اما ترافیک شبکه بین برنامه شما و پایگاه داده را کاهش می دهد. این به این دلیل است که (احتمالاً) دادههای کمتری برای سریالسازی، ارسال و سپس deserialise نسبت به زمانی که میخواهید همه فیلدهای موجود را واکشی کنید، وجود دارد.
با کاهش ترافیک شبکه و حجم داده هایی که باید پردازش شوند، این امر به سرعت بخشیدن به سایت لاراول شما کمک می کند. لطفاً توجه داشته باشید، در مثال بالا ممکن است هرگز چنین کاری را انجام ندهید و احتمالاً بسته به موقعیت از تکهها یا صفحهبندی استفاده میکنید.
این مثال فقط برای نشان دادن یک راه حل ممکن و آسان برای پیاده سازی است. این راه حل ممکن است در یک سایت یا برنامه کوچکتر پیشرفت های زیادی برای شما به همراه نداشته باشد. با این حال، این چیزی است که قطعاً میتواند به کاهش زمان بارگذاری در برنامههایی که عملکرد آنها یک الزام مهم است کمک کند.
همچنین اگر جدولی را که دارای فیلدهای BLOB یا TEXT است پرس و جو می کنید، ممکن است شاهد بهینه سازی بهتری باشید. این فیلدها به طور بالقوه می توانند مقدار قابل توجهی داده را در خود جای دهند و بنابراین به طور بالقوه می توانند زمان پرس و جو را افزایش دهند. بنابراین، اگر جدول مدل شما حاوی یکی از این فیلدها است، به طور صریح فیلدهایی را که در جستجوی خود نیاز دارید تعریف کنید تا زمان بارگذاری را کاهش دهید.
۲. تا جایی که امکان دارد از eager loading در لاراول استفاده کنید
وقتی هر مدلی را از پایگاه داده واکشی می کنید و سپس هر نوع پردازشی را روی روابط مدل انجام می دهید، مهم است که از eager loading استفاده کنید. eager loading با استفاده از لاراول بسیار ساده است و اساساً شما را از مواجهه با مشکل N+۱ در داده های خود آسوده میسازد.
این مشکل با ایجاد پرس و جوهای N+۱ در پایگاه داده ایجاد می شود، جایی که N تعداد مواردی است که از پایگاه داده واکشی می شود. برای توضیح بهتر این موضوع بیایید مثال زیر را بررسی کنیم.
تصور کنید که شما دو مدل (نظرات و نویسنده) دارید که یک رابطه یک به یک بین آنها وجود دارد. حالا تصور کنید که ۱۰۰ نظر دارید و می خواهید هر یک از آنها را مرور کنید و نام نویسنده آنها را واکشی کنید. بدون eager loading، کد شما ممکن است به شکل زیر باشد:
$comments = Comment::all();
foreach ($comments as $comment ) {
print_r($comment->author->name);
}
کد بالا منجر به ۱۰۱ پرس و جو در پایگاه داده می شود! اولین پرس و جو واکشی همه نظرات است. صد پرسش دیگر از دریافت نام نویسنده در هر تکرار حلقه حاصل می شود. بدیهی است که این می تواند باعث مشکلات عملکرد و کند کردن برنامه شما شود. بنابراین، چگونه ما این را بهبود بخشیم؟ با استفاده از eager loading، میتوانیم کد را به این صورت تغییر دهیم:
$comments = Comment::with(‘authors’)->get();
foreach ($comments as $comment ) {
print_r($comment->author->name);
}
همانطور که می بینید، این کد تقریباً با کد قبلی یکسان به نظر می رسد و همچنان قابل خواندن است. با افزودن عبارت ::with(‘authors’) نظرات به همراه نویسنده واکشی میشوند. بنابراین، این بدان معنی است که ما کوئری را از ۱۰۱ به ۲ کاهش خواهیم داد!
۳. از شر هر بسته غیر ضروری یا ناخواسته لاراول خلاص شوید
فایل composer.json خود را باز کنید و هر یک از وابستگی های خود را بررسی کنید. برای هر یک از وابستگی ها، از خود بپرسید “آیا من واقعا به این بسته نیاز دارم؟” پاسخ شما اکثراً بله خواهد بود، اما برای برخی از آنها ممکن است اینطور نباشد.
هر بار که یک کتابخانه Composer جدید را به پروژه خود اضافه می کنید، به طور بالقوه کدی را اضافه می کنید که ممکن است به صورت غیرضروری اجرا شود.
بستههای لاراول معمولاً شامل ارائهدهندگان خدماتی هستند که در هر درخواستی اجرا میشوند که خدمات را ثبت میکنند و کد را اجرا میکنند.
بنابراین، فرض کنید اگر ۲۰ بسته لاراول را به برنامه خود اضافه کنید، این احتمالاً حداقل ۲۰ کلاس است که در هر درخواست اجرا می شود. اگرچه این تأثیر زیادی بر عملکرد سایت ها یا برنامه هایی با حجم ترافیک کم نخواهد داشت، اما قطعاً می توانید تفاوت را در برنامه های بزرگتر متوجه شوید.
راه حل این است که تعیین کنید آیا واقعاً به همه بسته ها نیاز دارید یا خیر. شاید از بستهای استفاده میکنید که طیف وسیعی از ویژگیها را ارائه میدهد، اما در واقع فقط از یک ویژگی کوچک استفاده میکنید. از خود بپرسید “آیا می توانم این کد را خودم بنویسم و کل این بسته را حذف کنم”؟ البته، به دلیل محدودیت زمانی، نوشتن کد همیشه امکان پذیر نیست زیرا باید آن را بنویسید، آزمایش کنید و سپس آن را حفظ کنید.
۴. کش، کش، کش!
لاراول با روش های ذخیره سازی بسیاری عرضه می شود. این روش ها می توانند سرعت وب سایت یا برنامه شما را در حالی که فعال است افزایش دهند. به دلیل روشی که لاراول اجرا میکند، فایل مسیریابی را در هر درخواستی که انجام میشود تجزیه میکند.
این کار مستلزم خواندن فایل، تجزیه محتویات آن و سپس نگه داشتن آن به گونه ای است که برنامه شما بتواند از آن استفاده کند و بفهمد. بنابراین، لاراول دستوری را ارائه می دهد که می توانید از آن استفاده کنید و یک فایل مسیریابی واحد ایجاد می کند که می تواند بسیار سریعتر تجزیه شود:
php artisan route:cache
لطفاً توجه داشته باشید که اگر از این دستور استفاده میکنید و مسیرهای خود را تغییر میدهید، کد زیر را باید اجرا کنید:
php artisan route:clear
با این کار فایل مسیرهای کش شده حذف می شود تا مسیرهای جدیدتر شما ثبت شوند. اگر قبلاً آن را ندارید، ممکن است ارزش آن را داشته باشد که این دو دستور را به اسکریپت خود اضافه کنید.
۵. از آخرین نسخه PHP استفاده کنید
با هر نسخه جدید PHP که منتشر می شود، عملکرد و سرعت بهبود می یابد. Kinsta تست های زیادی را در چندین نسخه PHP و پلتفرم های مختلف (به عنوان مثال – Laravel، WordPress، Drupal، Joomla) انجام داد و دریافت که PHP ۷.۴ بهترین افزایش عملکرد را ارائه می دهد.
اجرای این نکته خاص ممکن است در مقایسه با سایر نکات بالا کمی دشوارتر باشد زیرا باید کد خود را بررسی کنید تا مطمئن شوید که می توانید با خیال راحت به آخرین نسخه PHP به روز رسانی کنید. به عنوان یک نکته جانبی، داشتن یک مجموعه تست خودکار ممکن است به شما در انجام این ارتقاء اعتماد به نفس بدهد!
۶. از صف ها استفاده کنید
اجرای این نکته ممکن است کمی بیشتر از سایر نکات بالا طول بکشد، زیرا نکات قبلی بر کدها تکیه داشتند. با وجود این، این نکته احتمالاً از نظر تجربه کاربری یکی از سودمندترین نکات خواهد بود.یکی از راه هایی که می توانید زمان عملکرد را کاهش دهید استفاده از صف های لاراول است.
اگر کدی در کنترلر یا کلاسهای شما در درخواستی اجرا میشود که مخصوصاً برای پاسخ مرورگر وب مورد نیاز نیست، معمولاً میتوانیم آن را در صف قرار دهیم. برای درک آسان تر، این مثال را بررسی کنید:
class ContactController extends Controller
{
/**
* Store a new podcast.
*
* @param Request $request
* @return JsonResponse
*/
public function store(ContactFormRequest $request)
{
$request->storeContactFormDetails();
Mail::to('mail@ashallendesign.co.uk')->send(new ContactFormSubmission);
return response()->json(['success' => true]);
}
}
در کد بالا، زمانی که متد store فراخوانی میشود، جزئیات فرم تماس را در پایگاه داده ذخیره میکند، یک ایمیل به آدرسی ارسال میکند تا آنها را از ارسال فرم تماس جدید مطلع کند، و یک پاسخ JSON را برمیگرداند. مشکل این کد این است که کاربر باید منتظر بماند تا ایمیل ارسال شود تا پاسخ خود را در مرورگر وب دریافت کند. اگرچه این ممکن است فقط چند ثانیه طول بکشد، اما به طور بالقوه می تواند باعث خروج بازدیدکنندگان شود.
برای استفاده از سیستم صف، میتوانیم کد لاراول را به شکل زیر بهروزرسانی کنیم:
class ContactController extends Controller
{
/**
* Store a new podcast.
*
* @param Request $request
* @return JsonResponse
*/
public function store(ContactFormRequest $request)
{
$request->storeContactFormDetails();
dispatch(function () {
Mail::to('mail@ashallendesign.co.uk')->send(new ContactFormSubmission);
})->afterResponse();
return response()->json(['success' => true]);
}
}
کد بالا در متد store اکنون جزئیات فرم تماس را در پایگاه داده ذخیره می کند، نامه را برای ارسال در صف قرار می دهد و سپس پاسخ را برمی گرداند. هنگامی که پاسخ به مرورگر وب کاربر ارسال شد، ایمیل به صف اضافه می شود تا بتوان آن را پردازش کرد. با انجام این کار، به این معنی است که نیازی نیست قبل از بازگرداندن پاسخ، منتظر ارسال ایمیل باشیم.