چگونه بهینه سازی برنامه PHP Laravel Web برای عملکرد بالا؟

لاراول چیزهای زیادی است. اما سریع یکی از آنها نیست. بیایید برخی ترفندهای مربوط به تجارت را یاد بگیریم تا سریعتر انجام شود!


هیچ برنامه نویس PHP دست نخورده است لاراول این روزها. آنها یا یک توسعه دهنده خردسال یا سطح متوسط ​​هستند که عاشق توسعه سریع Laravel هستند ، یا یک توسعه دهنده ارشد هستند که به دلیل فشارهای بازار مجبور به یادگیری لاراول هستند.

در هر صورت ، هیچ انكاری وجود ندارد كه لاراول احیاء اکوسیستم PHP را انجام دهد (مطمئناً اگر لاراول در آنجا نباشد ، من مدتها پیش دنیای PHP را ترک می کردم).

قطعه ای از ستایش (تا حدودی توجیه شده) از لاراول

با این حال ، از آنجا که لاراول به سمت عقب خم می شود و کار را برای شما آسان می کند ، بدین معنی است که در زیر آن شما تن و تن کار می کنید تا مطمئن شوید که به عنوان یک توسعه دهنده زندگی راحت دارید. تمام ویژگیهای “جادویی” لاراول که به نظر می رسد کار می کنند دارای لایه هایی از لایه های کد هستند که هر بار اجرای یک ویژگی نیاز به شلاق زدن دارند. حتی یک استثناء ساده اثری از سوراخ خرگوش دارد (توجه کنید که خطا از کجا شروع می شود ، تا رسیدن به هسته اصلی):

برای آنچه که به نظر می رسد خطای تلفیق در یکی از نماها باشد ، 18 تماس عملکردی برای ردیابی وجود دارد. من شخصاً به 40 نفر رسیده ام و اگر از كتابخانه ها و افزونه های دیگر استفاده می كنید ، به راحتی می توان موارد بیشتری را یافت.

این نکته را بدانید که به طور پیش فرض این لایه ها بر روی لایه های کد ، لاراول را کند می کنند.

لاراول چقدر کند است?

راستش ، پاسخ به این سؤال به چند دلیل کاملاً غیرممکن است.

اولین, هیچ استاندارد قابل قبول ، عینی و معقولی برای اندازه گیری سرعت برنامه های وب وجود ندارد. سریعتر یا کندتر در مقایسه با آنچه؟ در چه شرایطی?

دومین, یک برنامه وب به موارد زیادی بستگی دارد (بانک اطلاعاتی ، سیستم فایل ، شبکه ، حافظه پنهان ، و غیره) که صحبت کردن در مورد سرعت ساده است. یک برنامه وب بسیار سریع با یک پایگاه داده بسیار کند یک برنامه وب بسیار کند است. ��

اما این عدم قطعیت دقیقاً به همین دلیل است که معیارها محبوب هستند. حتی اگر آنها به معنای هیچ چیز نیستند این و این) ، آنها چهارچوبی از مرجع را ارائه می دهند و به ما کمک می کنند دیوانه شویم. بنابراین ، با چند نمک آماده ، اجازه دهید یک ایده اشتباه و نادرست از سرعت در بین چارچوب های PHP بگیریم.

با استفاده از این GitHub نسبتاً قابل احترام منبع, در اینجا چگونگی ترسیم چارچوبهای PHP هنگام مقایسه:

شما حتی ممکن است لاراول را در اینجا متوجه نشوید (حتی اگر سخت سخت بزنید) مگر اینکه پرونده خود را درست به انتهای دم بکشید. بله دوستان عزیز ، لاراول آخر می آید! اکنون ، اعطا می شود ، بسیاری از این “چهارچوبها” خیلی کاربردی و حتی مفید نیستند ، اما این به ما می گوید که لاراول تنبل با مقایسه با سایر محبوب ترها چقدر است..

به طور معمول ، این “کندی” در برنامه ها وجود ندارد زیرا برنامه های وب روزمره ما به ندرت به تعداد بالایی می روند. اما وقتی این کار را انجام دهند (مثلاً از 200-500 همزمان) ، سرورها شروع به خفه کردن و مرگ می کنند. زمان آن است که حتی پرتاب سخت افزار بیشتر روی آن مشکل را کاهش ندهد ، و صورتحساب زیرساختها آنقدر سریع بالا می روند که آرمانهای بالای رایانش ابری شما خراب می شود.

اما سلام ، تشویق! این مقاله درمورد آنچه نمی توان انجام داد ، بلکه درمورد آنچه می توان انجام داد ، نیست. ��

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

چهار نوع بهینه سازی

به نظر من ، بهینه سازی در چهار سطح مجزا (وقتی صحبت از برنامه های PHP است ، انجام می شود):

  1. سطح زبان: این بدان معنی است که شما از نسخه سریعتر زبان استفاده می کنید و از ویژگی ها / سبک های خاص کد نویسی به زبان جلوگیری می کنید که باعث کند شدن کد شما می شود.
  2. سطح چارچوب: این مواردی است که در این مقاله به آنها خواهیم پرداخت.
  3. سطح زیرساخت: تنظیم مدیر فرآیند پی اچ پی ، سرور وب ، پایگاه داده و غیره.
  4. سطح سخت افزار: انتقال به یک ارائه دهنده میزبانی سخت افزار بهتر ، سریعتر و قدرتمندتر.

همه این نوع بهینه سازی ها جای خود را دارند (برای مثال ، بهینه سازی php-fpm بسیار مهم و قدرتمند است). اما تمرکز این مقاله بهینه سازیهای صرفاً از نوع 2 خواهد بود: موارد مرتبط با این چارچوب.

به هر حال ، هیچ منطقی در پشت شماره گذاری وجود ندارد ، و این یک استاندارد پذیرفته نیست. من فقط اینها را درست کردم لطفاً هرگز از من نقل قول نکنید و بگویید “ما به سرور خود به بهینه سازی نوع 3 نیاز داریم” یا اینکه سرپرست تیم شما شما را می کشد ، مرا پیدا خواهد کرد ، و سپس مرا نیز کشت. ��

و اکنون ، سرانجام ، ما به سرزمین موعود می رسیم.

از سؤالات پایگاه داده n + 1 آگاه باشید

مشکل پرس و جو n + 1 هنگام استفاده از ORM ها معمول است. Laravel دارای ORM قدرتمند خود به نام Eloquent است که بسیار زیبا و راحت است ، بنابراین اغلب فراموش می کنیم ببینیم چه اتفاقی می افتد.

سناریوی بسیار متداولی را در نظر بگیرید: نمایش لیست کلیه سفارشات درج شده توسط لیست مشخصی از مشتریان. این در سیستم های تجارت الکترونیکی و کلیه رابط های گزارش دهی به طور کلی بسیار رایج است که در آن ما نیاز به نمایش همه اشخاص مرتبط با برخی نهادها داریم.

در لاراول ، ما ممکن است یک عملکرد کنترل کننده را تصور کنیم که این کار را مانند این انجام دهد:

کلاس OrdersController کنترلر را گسترش می دهد
{
// …

عملکرد عمومی getAllByCustomers (درخواست $ $ ، آرایه $ آیدی) {
$ مشتریان = مشتری :: findMany ($ ids)؛
$ سفارش = جمع آوری ()؛ // مجموعه جدید

foreach (مشتریان $ $ به عنوان مشتری) {
$ سفارشات = $ سفارشات->ادغام (مشتری $->سفارشات)؛
}

نمای برگشت (‘admin.reports.order’ ، [‘سفارش’ => $ سفارشات))؛
}
}

شیرین! و مهمتر از همه ، ظریف ، زیبا. ����

متأسفانه ، این یک روش فاجعه بار برای نوشتن کد در Laravel است.

به همین دلیل.

وقتی از ORM می خواهیم مشتری های داده شده را جستجو کند ، پرس و جو SQL مانند این تولید می شود:

SELECT * از مشتریانی که در آن شناسه هستند (22 ، 45 ، 34 ، …)؛

که دقیقاً همانطور که انتظار می رود در نتیجه ، تمام ردیف های برگشتی در مجموعه مشتریان $ درون عملکرد کنترلر ذخیره می شوند.

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

SELECT * از سفارشات WHERE user_id = 22؛

. . . هر چند برابر مشتری.

به عبارت دیگر ، اگر بخواهیم داده سفارش را برای 1000 مشتری بدست آوریم ، تعداد کل نمایش داده های بانک اطلاعاتی اجرا شده 1 خواهد بود (برای واگذاری کلیه داده های مشتری) + 1000 (برای واگذاری داده های سفارش برای هر مشتری) = 1001. جایی است که نام n + 1 از آن به وجود می آید.

آیا می توانیم بهتر عمل کنیم؟ قطعا! با استفاده از آنچه که به عنوان بارگیری مشتاق شناخته می شود ، می توانیم ORM را مجبور کنیم یک JOIN را انجام دهد و تمام داده های مورد نیاز را در یک سؤال واحد بازگرداند! مثل این:

$ Order = مشتری :: findMany ($ ids)->با (“سفارشات”)->گرفتن()؛

ساختار داده حاصل ، مطمئناً توشی توخالی است ، اما داده های سفارش را می توان به راحتی استخراج کرد. در این صورت پرس و جو مجرد نتیجه ای مشابه این است:

SELECT * از مشتریان وارد سفارشات خود در مشتریان شوید.id = order.customer_id WHERE customers.id IN (22، 45، ….)؛

البته یک سؤال واحد بهتر از هزار سؤال اضافی است. تصور کنید اگر 10،000 مشتری برای پردازش وجود داشته باشند چه اتفاقی می افتد! یا خدای ناکرده اگر ما نیز می خواستیم وسایل موجود در هر سفارش را نمایش دهیم! به یاد داشته باشید ، نام این تکنیک بارگیری مشتاق است ، و تقریباً همیشه ایده خوبی است.

پیکربندی را ذخیره کنید!

یکی از دلایل انعطاف پذیری لاراول ، انواع پرونده پیکربندی است که بخشی از چارچوب است. می خواهید نحوه / مکان ذخیره تصاویر را تغییر دهید?

خوب ، فقط پرونده پیکربندی / filesystems.php را تغییر دهید (حداقل در هنگام نوشتن). آیا می خواهید با چند درایور صف کار کنید؟ احساس رایگان برای توصیف آنها در پیکربندی / queue.php. من فقط حساب کردم و فهمیدم که 13 پرونده پیکربندی برای جنبه های مختلف چارچوب وجود دارد ، به شما اطمینان می دهم بدون توجه به آنچه می خواهید تغییر دهید ناامید نخواهید شد..

با توجه به ماهیت PHP ، هر بار درخواست جدید وب وارد می شود ، Laravel از خواب بیدار می شود ، همه چیز را چکمه می کند و همه این پرونده های پیکربندی را تجزیه می کند تا بفهمد چگونه این بار کارهای متفاوتی را انجام دهید. جز این که احمقانه است اگر در چند روز گذشته چیزی تغییر نکرده باشد! بازسازی پیکربندی در هر درخواست ، زباله ای است که می توان از آن جلوگیری کرد (و در واقع باید از آن جلوگیری شود) ، و راه بیرون یک دستور ساده ای است که Laravel ارائه می دهد:

پیکربندی php artisan: cache

این کار ترکیبی از همه پرونده های پیکربندی موجود در یک و یک حافظه پنهان است ، جایی برای بازیابی سریع. دفعه بعد که یک درخواست وب وجود دارد ، لاراول به سادگی این فایل واحد را می خواند و می رود.

گفته می شود ، حافظه پنهان پیکربندی یک عمل بسیار ظریف است که می تواند در صورت شما منفجر شود. بزرگترین مورد این است که هنگامی که این دستور را صادر کردید ، عملکرد env () از همه جا به جز پرونده پیکربندی فراخوانده می شود!

وقتی فکرش را می کنید حس می کند. اگر از حافظه پنهان تنظیمات استفاده می کنید ، به چارچوب می گویید ، “شما می دانید چه چیزی ، فکر می کنم من مسائل را به خوبی تنظیم کرده ام و 100٪ مطمئن هستم که نمی خواهم آنها را تغییر دهم.” به عبارت دیگر ، شما انتظار دارید که محیط ثابت نماند ، این همان چیزی است که پرونده های .env برای آن ایجاد شده اند.

با این گفته ، در اینجا چند قانون آراسته ، مقدس ، غیرقابل شکستن از حافظه پنهان سازی پیکربندی شده است:

  1. این کار را فقط بر روی یک سیستم تولید انجام دهید.
  2. این کار را فقط اگر واقعاً انجام دهید ، واقعاً مطمئن باشید که می خواهید پیکربندی را یخ بزنید.
  3. اگر مشکلی پیش آمد ، تنظیمات را با حافظه پنهان حرفه ای PHP خنثی کنید: پاک کنید
  4. دعا کنید که خسارت وارده به مشاغل مهم نبوده باشد!

خدمات اتوآد شده را کاهش دهید

برای کمک ، لاراول وقتی از خواب بیدار می شود ، یک بار سرویس بار می کند. این موارد در پرونده پیکربندی / app.php به عنوان بخشی از کلید آرایه “ارائه دهندگان” موجود است. بیایید نگاهی به آنچه در مورد من دارم بیاندازیم:

/ *
|————————————————————————–
| ارائه دهندگان خدمات Autoloaded
|————————————————————————–
|
| ارائه دهندگان خدمات ذکر شده در اینجا به طور خودکار روی بارگیری می شوند
| درخواست به درخواست شما. احساس رایگان برای اضافه کردن خدمات خود را به
| این آرایه برای اعطای قابلیت های گسترده به برنامه های شما.
|
* /

‘ارائه دهندگان’ => [

/ *
* ارائه دهندگان خدمات چارچوب Laravel…
* /
کلاس \ Auth \ AuthServiceProvider :: را روشن کنید,
روشن کردن \ پخش \ \ BroadcastServiceProvider :: کلاس,
روشن کردن \ اتوبوس \ BusServiceProvider :: کلاس,
کلاس \ روشن \ کش \ CacheServiceProvider ::,
روشن کردن \ بنیاد \ ارائه دهندگان \ ConsoleSupportServiceProvider :: کلاس,
روشن کردن \ کوکی \ CookieServiceProvider :: کلاس,
Illuminate \ Database \ DatabaseServiceProvider :: کلاس,
روشن کردن \ رمزگذاری \ رمزگذاری رمزنگاری پروندrov :: کلاس,
Illuminate \ Filesystem \ FilesystemServiceProvider :: کلاس,
روشن کردن \ بنیاد \ ارائه دهندگان \ FoundationServiceProvider :: کلاس,
روشن کردن \ هاشینگ \ HashServiceProvider :: کلاس,
روشن کردن \ نامه \ MailServiceProvider :: کلاس,
روشن کردن \ اطلاعیه ها \ notificationServiceProvider :: کلاس,
نورپردازی \ Pagination \ PaginationServiceProvider :: کلاس,
روشن کردن \ خط لوله \ PipelineServiceProvider :: کلاس,
کلاس \ Queue \ QueueServiceProvider :: را روشن کنید,
روشن کردن \ Redis \ RedisServiceProvider :: کلاس,
کلاس \ Auth \ Passwords \ PasswordResetServiceProvider :: کلاس را روشن کنید,
روشن کردن \ جلسه \ SessionServiceProvider :: کلاس,
نورپردازی \ ترجمه \ ترجمهServiceProvider :: کلاس,
Illuminate \ Validation \ ValidationServiceProvider :: کلاس,
روشن کردن \ مشاهده \ ViewServiceProvider :: کلاس,

/ *
* ارائه دهندگان خدمات بسته بندی…
* /

/ *
* ارائه دهندگان خدمات برنامه…
* /
برنامه \ ارائه دهندگان \ AppServiceProvider :: کلاس,
برنامه \ ارائه دهندگان \ AuthServiceProvider :: کلاس,
// برنامه \ ارائه دهندگان \ BroadcastServiceProvider :: کلاس,
برنامه \ ارائه دهندگان \ EventServiceProvider :: کلاس,
برنامه \ ارائه دهندگان \ RouteServiceProvider :: کلاس,

],

یک بار دیگر ، من حساب کردم ، و 27 سرویس ذکر شده وجود دارد! اکنون ، ممکن است شما به همه آنها احتیاج داشته باشید ، اما بعید نیست.

به عنوان مثال ، من در حال حاضر در حال ساختن یک API REST هستم ، این بدان معناست که من به ارائه دهنده خدمات جلسه ، ارائه دهنده خدمات ، و غیره احتیاج ندارم و از آنجا که من چند کار را انجام می دهم و از پیش فرض های چارچوب پیروی نمی کنم. ، من همچنین می توانم ارائه دهنده خدمات Auth ، ارائه دهنده خدمات Pagination ، ارائه دهنده خدمات ترجمه و غیره را غیرفعال کنم. در کل ، تقریبا نیمی از این موارد مورد استفاده من نیست.

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

با پشته های میان افزار خردمند باشید

هنگامی که به پردازش سفارشی درخواست وب ورودی نیاز دارید ، ایجاد یک میان افزار جدید پاسخ است. اکنون ، این وسوسه کننده است که برنامه / Http / Kernel.php را باز کنید و میان افزار را در وب یا پشته API بچسبانید. به این ترتیب ، آن را در سراسر برنامه در دسترس می کند و اگر کاری مزاحم انجام نداده است (مانند ورود به سیستم یا اطلاع رسانی ، به عنوان مثال).

با این حال ، با بزرگ شدن برنامه ، این مجموعه از برنامه های وسط جهانی می تواند به یک بار خاموش برنامه تبدیل شود اگر همه (یا اکثریت) اینها در هر درخواست حضور داشته باشند ، حتی اگر هیچ دلیل کاری برای آن وجود نداشته باشد.

به عبارت دیگر ، مراقب باشید که یک واسطه جدید را در کجا اضافه یا اعمال کنید. این می تواند راحت تر اضافه کردن چیزی در سطح جهان باشد ، اما در طولانی مدت مجازات عملکرد بسیار بالا است. من می دانم که اگر بخواهید هر زمان که یک تغییر جدید انجام شود ، وسایل واسطه را به صورت انتخابی اعمال کنید ، باید آن را متحمل شوید ، اما این دردی است که من خواهان آن هستم و توصیه می کنم!

از ORM اجتناب کنید (در بعضی مواقع)

در حالی که Eloquent بسیاری از جنبه های تعامل DB را لذت بخش می کند ، اما بهای سرعت آن به دست می آید. نقشه بردار بودن ، ORM نه تنها باید سوابق را از پایگاه داده بدست آورد بلکه اشیاء مدل را فوراً می کند و آنها را با داده های ستونی هیدراته می کند..

بنابراین ، اگر یک کاربر ساده $ $ = کاربر :: همه () داشته باشید و مثلاً 10،000 کاربر وجود داشته باشد ، این چارچوب 10،000 ردیف را از بانک اطلاعات دریافت می کند و در داخل کشور 10،000 کاربر جدید () را انجام می دهد و خصوصیات آنها را با داده های مربوطه پر می کند. . این کارهای گسترده ای است که در پشت صحنه انجام می شود ، و اگر پایگاه داده جایی است که برنامه شما به عنوان تنگنا تبدیل می شود ، دور زدن ORM گاهی اوقات ایده خوبی است.

این به ویژه برای سؤالات پیچیده SQL صحیح است ، جایی که شما باید تعداد زیادی از حلقه ها را پرش کرده و بسته های بسته را بنویسید و هنوز با یک پرس و جو کارآمد به پایان رسید. در چنین مواردی ، انجام یک DB :: raw () و نوشتن پرس و جو با دست ترجیح داده می شود.

رفتن توسط این مطالعه عملکرد ، حتی برای درج های ساده Eloquent بسیار کندتر از افزایش تعداد سوابق است:

تا حد امکان از حافظه پنهان استفاده کنید

یکی از بهترین رازهای بهینه سازی برنامه وب ذخیره سازی ذخیره سازی است.

برای موارد ناشناخته ، حافظه پنهان به معنای پیش پردازش و ذخیره نتایج گران است (از نظر CPU و استفاده از حافظه گران است) و به سادگی با تکرار همان پرس و جو ، آنها را برگردانید..

به عنوان مثال ، در یک فروشگاه تجارت الکترونیک ، ممکن است به 2 میلیون محصول برسد ، بیشتر اوقات مردم به کالاهایی که تازه عرضه شده اند ، در یک محدوده قیمت خاص و برای گروه سنی خاص علاقه مند هستند. جستجوی پایگاه داده برای این اطلاعات بی فایده است – از آنجا که پرس و جو اغلب تغییر نمی کند ، بهتر است این نتایج را در جایی ذخیره کنیم که بتوانیم سریع به آنها دسترسی پیدا کنیم.

لاراول از چندین نوع پشتیبانی پشتیبانی کرده است ذخیره سازی. علاوه بر استفاده از درایور حافظه پنهان و ساختن سیستم حافظه پنهان از زمین به بالا ، ممکن است بخواهید از برخی بسته های Laravel استفاده کنید که حافظه پنهان مدل, ذخیره نمایش داده شد, و غیره.

توجه داشته باشید که فراتر از موارد کاربردی ساده ، بسته های ذخیره سازی از پیش ساخته می توانند مشکلات بیشتری را نسبت به حل آنها ایجاد کنند.

ذخیره حافظه را ترجیح دهید

هنگامی که چیزی را در Laravel ذخیره می کنید ، گزینه های مختلفی دارید که محاسبه نتیجه ای را که باید ذخیره شود ذخیره کنید. این گزینه ها همچنین به عنوان شناخته می شوند درایور حافظه نهان. بنابراین ، در حالی که استفاده از سیستم فایل برای ذخیره سازی نتایج حافظه نهان ممکن و کاملاً منطقی است ، اما واقعاً منظور از ذخیره سازی نیست..

در حالت ایده آل ، شما می خواهید از حافظه نهان حافظه (زندگی در RAM به طور کامل) مانند Redis ، Memcached ، MongoDB و غیره استفاده کنید ، به طوری که تحت بارهای بالاتر ، حافظه پنهان به جای تبدیل شدن به خود تنگنا ، یک استفاده حیاتی را ایجاد می کند..

حال ممکن است فکر کنید که داشتن دیسک SSD تقریباً مشابه استفاده از چوب RAM است ، اما حتی نزدیک نیست. حتی غیررسمی معیارها نشان می دهد که RAM از سرعت SSD 10-20 برابر بهتر است.

سیستم مورد علاقه من هنگام صحبت با حافظه پنهان ، Redis است. این است سریع مسخره (100000 عملیات خواندن در ثانیه رایج است) ، و برای سیستم های حافظه پنهان بسیار بزرگ ، می توان در a تکامل داد خوشه به راحتی.

مسیرها را ذخیره کنید

درست مانند پیکربندی برنامه ، مسیرها به مرور زمان تغییر نمی کنند و یک نامزد ایده آل برای ذخیره سازی هستند. این به ویژه صادق است اگر شما نمی توانید فایلهای بزرگی مانند من بایستید و در پایان تقسیم web.php و api.php خود را بر روی چندین پرونده تقسیم کنید. یک فرمان واحد Laravel تمام مسیرهای موجود را بسته بندی می کند و آنها را برای دستیابی به آینده مفید می کند:

مسیر artisan php: cache

و وقتی کار خود را اضافه یا تغییر کردید ، به سادگی انجام دهید:

مسیر صنعتگر php: واضح است

بهینه سازی تصویر و CDN

تصاویر قلب و روان اکثر برنامه های وب است. به طور تصادفی ، آنها همچنین بزرگترین مصرف کننده پهنای باند و یکی از بزرگترین دلایل برنامه ها و وب سایت های کند هستند. اگر تصاویر آپلود شده را به سادگی با سر و صدا روی سرور ذخیره می کنید و آنها را در پاسخهای HTTP ارسال می کنید ، می توانید فرصت بهینه سازی گسترده ای را از این طریق بکشید..

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

در عوض ، به دنبال راه حلی مانند ابری که به طور خودکار تصاویر را در پرواز تغییر اندازه و بهینه می کند.

اگر این امکان پذیر نیست ، از حافظه چیزی مانند Cloudflare برای ذخیره و ارائه تصاویر در حالی که در سرور شما ذخیره شده اند استفاده کنید.

و حتی اگر این امکان پذیر نباشد ، کمی فشار دادن نرم افزار وب سرور خود برای فشرده سازی دارایی ها و هدایت مرورگر بازدید کننده به سمت حافظه پنهان کردن موارد ، تفاوت زیادی ایجاد می کند. در اینجا چگونگی ظاهر یک قطعه از تنظیمات Nginx آورده شده است:

سرور {

# پرونده کوتاه شد

تنظیمات فشرده سازی # gzip
gzip روی؛
gzip_comp_level 5؛
gzip_min_l طول 256؛
gzip_proxied هر؛
gzip_vary در؛

# کنترل حافظه نهان
مکان ~ * \. (ico | css | js | gif | jpeg | jpg | png | woff | ttf | otf | svg | woff2 | eot) $
منقضی می شود 1d؛
access_log خاموش؛
add_header پراگما عمومی؛
add_header Cache-Control "عمومی ، حداکثر سنی = 86400"؛
}
}

من می دانم که بهینه سازی تصویر هیچ ارتباطی با Laravel ندارد ، اما این یک ترفند ساده و قدرتمند است (و اغلب غفلت می شود) که نمی تواند به خودم کمک کند.

بهینه سازی خودکار

Autoloading یک ویژگی مرتب و نه چندان قدیمی در PHP است که به طرز مشکوک زبان را از عذاب نجات می دهد. گفته می شود ، فرایند یافتن و بارگیری کلاس مربوطه با رمزگشایی یک رشته نام نام خاص ، زمان می برد و می توان در استقرار تولید در جایی که کارایی مطلوب داشته باشد ، جلوگیری کرد. بار دیگر ، Laravel یک راه حل تک دستورالعمل برای این کار دارد:

آهنگساز نصب –optimize-autoloader –no-dev

با صف دوست شوید

صف چگونه بسیاری از موارد را پردازش می کنید و هر یک از آنها چند میلی ثانیه طول می کشد. مثال خوب ارسال ایمیل – یک مورد گسترده در برنامه های وب شلیک چند ایمیل به صورت اعلان در هنگام انجام برخی کاربرها است..

به عنوان مثال ، در یک محصول تازه به بازار عرضه شده ، ممکن است بخواهید رهبری شرکت (برخی آدرسهای ایمیل 6-7) هر زمان که شخصی یک سفارش بالاتر از یک مقدار مشخص را اعلام کند ، مطلع شود. با فرض اینکه دروازه ایمیل شما می تواند به درخواست SMTP شما در 500ms پاسخ دهد ، ما در مورد 3-4 ثانیه منتظر کاربر قبل از شروع سفارش صحبت می کنیم. یک قطعه UX واقعاً بد است ، من مطمئن هستم که موافق.

راه حل این است که شغل ها را هنگام ورود به آنها ذخیره کنید ، به کاربر بگویید که همه چیز به خوبی پیش رفت و مراحل بعدی آنها را (چند ثانیه) پردازش کرد. در صورت بروز خطا ، مشاغل موجود در صف قبل می توانند چندین بار دوباره امتحان شوند ، قبل از اینکه آنها اعلام نکنند.

اعتبار: Microsoft.com

در حالی که یک سیستم صف تنظیم را کمی پیچیده می کند (و برخی از آن ها مانیتورینگ اضافه می کنند) ، در یک برنامه وب مدرن ضروری است.

بهینه سازی دارایی (Laravel Mix)

برای هر گونه دارایی جلویی در برنامه Laravel ، لطفاً اطمینان حاصل کنید که یک خط لوله وجود دارد که کلیه پرونده های دارایی را گردآوری و به حداقل می رساند. کسانی که از سیستم بسته نرم افزاری مانند Webpack ، Gulp ، Parcel و غیره راحت هستند ، نیازی به ناراحتی ندارند ، اما اگر قبلاً این کار را انجام نمی دهید, مخلوط لاراول یک توصیه کامل است.

میکس یک بسته بندی سبک (و با صداقت! لذت بخش است!) در اطراف Webpack است که به کلیه پرونده های CSS ، SASS ، JS و غیره شما اهمیت می دهد. یک پرونده معمولی .mix.js می تواند به همین اندازه کوچک باشد و هنوز هم شگفتی ساز است:

const mix = نیاز (“لاراول-میکس”)؛

mix.js (“منابع / js / app.js” ، “عمومی / js”)
.sass (‘منابع / sass / app.scss’ ، ‘عمومی / CSS’)؛

هنگامی که برای تولید آماده هستید و تولید npm را اجرا می کنید ، به طور خودکار از واردات ، کوچک سازی ، بهینه سازی و کل سبزه مراقبت می کند. Mix به فایلهای سنتی JS و CSS بلکه همچنین مؤلفه های Vue و React که ممکن است در جریان کار برنامه خود داشته باشید ، مراقبت می کند..

اطلاعات بیشتر اینجا!

نتیجه

بهینه سازی عملکرد هنر بیشتر از علم است – دانستن اینکه چگونه و چقدر باید انجام شود از آنچه باید انجام شود مهم است. به گفته این ، هیچ خاتمه ای وجود ندارد که چقدر و آنچه را می توانید در یک برنامه Laravel بهینه کنید.

اما هر کاری که انجام دهید ، می خواهم شما را با برخی توصیه های مربوط به بخش بندی کنار بگذارم – بهینه سازی باید در صورت وجود دلیل محکمی انجام شود ، و نه به این دلیل که به نظر می رسد خوب است یا به دلیل اینکه در مورد عملکرد برنامه برای 100،000+ کاربر در حالی که واقعیت دارید ، دچار پارسا هستید. فقط 10 وجود دارد.

اگر مطمئن نیستید که آیا باید برنامه خود را بهینه کنید یا خیر ، لازم نیست لانه شاخ ضرب المثلی را لگد بزنید. یک برنامه کاری که احساس کسل کننده ای می کند اما دقیقاً آنچه را که باید انجام دهد ده برابر مطلوب تر از برنامه ای است که در یک سوپر ماشین هیبریدی جهش یافته بهینه شده است اما اکنون مسطح است..

و برای اینکه newbiew استاد لاراول شود ، این موضوع را بررسی کنید دوره آنلاین.

ممکن است برنامه های شما خیلی سریعتر اجرا شوند! ��

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map