Ấu trùng là nhiều thứ. Nhưng nhanh là một trong số họ. Hãy để học hỏi một số thủ thuật trong giao dịch để làm cho nó đi nhanh hơn!

Không có nhà phát triển PHP nào bị ảnh hưởng bởi Ấu trùng những ngày này Họ là một nhà phát triển cấp trung hoặc cấp thấp, yêu thích sự phát triển nhanh chóng mà Laravel cung cấp, hoặc họ là một nhà phát triển cấp cao, người buộc phải học hỏi Laravel vì áp lực thị trường.

Dù bằng cách nào, cũng không thể phủ nhận rằng Laravel đã hồi sinh hệ sinh thái PHP (tôi, chắc chắn, sẽ đã rời khỏi thế giới PHP từ lâu nếu Laravel không còn ở đó).

Một đoạn tự khen ngợi (hơi hợp lý) từ Laravel

Tuy nhiên, vì Laravel uốn cong về phía sau để làm cho mọi thứ trở nên dễ dàng với bạn, điều đó có nghĩa là bên dưới nó LỚN làm rất nhiều công việc để đảm bảo bạn có một cuộc sống thoải mái như một nhà phát triển. Tất cả các tính năng ma thuật của người Viking về Laravel dường như hoạt động đều có các lớp trên các lớp mã cần được đánh dấu mỗi khi một tính năng chạy. Ngay cả một Ngoại lệ đơn giản cũng theo dõi lỗ thỏ sâu đến mức nào (chú ý lỗi bắt đầu từ đâu, đến tận nhân chính):

Đối với những gì dường như là một lỗi biên dịch trong một trong các khung nhìn, có 18 lệnh gọi hàm để theo dõi. Cá nhân tôi đã đi qua 40, và có thể dễ dàng có nhiều hơn nếu bạn sử dụng các thư viện và plugin khác.

Theo mặc định, điểm này nằm trên các lớp mã, làm cho Laravel chậm.

Làm thế nào chậm là Laravel?

Thành thật mà nói, nó không thể trả lời câu hỏi này vì nhiều lý do.

Đầu tiên, Không có tiêu chuẩn nào được chấp nhận, khách quan, hợp lý để đo tốc độ của các ứng dụng Web. Nhanh hơn hay chậm hơn so với những gì? Dưới những điều kiện nào?

Thứ hai, một ứng dụng Web phụ thuộc vào rất nhiều thứ (cơ sở dữ liệu, hệ thống tập tin, mạng, bộ đệm, v.v.) mà nó rất đơn giản để nói về tốc độ. Một ứng dụng Web rất nhanh với cơ sở dữ liệu rất chậm là một ứng dụng web rất chậm. ��

Nhưng sự không chắc chắn này chính xác là lý do tại sao điểm chuẩn là phổ biến. Mặc dù chúng không có nghĩa gì (xem điều nàyđiều này), họ cung cấp một số khung tham chiếu và giúp chúng tôi phát điên. Do đó, với một vài nhúm muối đã sẵn sàng, hãy để Lôi hiểu sai về tốc độ giữa các khung công tác PHP.

Đi bằng GitHub khá đáng kính này nguồn, Ở đây, cách thức các khung công tác PHP xếp hàng khi so sánh:

Bạn thậm chí có thể không nhận thấy Laravel ở đây (ngay cả khi bạn nheo mắt thật mạnh) trừ khi bạn ném trường hợp của bạn ngay đến cuối đuôi. Vâng, các bạn thân mến, Laravel đến sau cùng! Bây giờ, được cho phép, hầu hết các khung công tác trên máy tính này không thực tế hoặc thậm chí hữu ích, nhưng nó cho chúng ta biết sự chậm chạp của Laravel khi so sánh với những cái phổ biến khác.

Thông thường, tính năng chậm chạp này của Google không có tính năng trong các ứng dụng vì các ứng dụng web hàng ngày của chúng tôi hiếm khi đạt số lượng cao. Nhưng một khi họ làm (giả sử, lên tới 200-500 đồng thời), các máy chủ bắt đầu bị nghẹt thở và chết. Đó là lúc mà ngay cả khi ném thêm phần cứng vào vấn đề, không cắt giảm và hóa đơn cơ sở hạ tầng tăng nhanh đến mức những lý tưởng cao về điện toán đám mây của bạn sụp đổ.

Nhưng này, vui lên nào! Bài viết này không phải là về những gì có thể được thực hiện, nhưng về những gì có thể được thực hiện. ��

Tin tốt là, bạn có thể làm rất nhiều để làm cho ứng dụng Laravel của bạn đi nhanh hơn. Vài lần nhanh. Vâng, không đùa đâu. Bạn có thể làm cho cùng một codebase đi theo đường đạn đạo và tiết kiệm hàng trăm đô la cho cơ sở hạ tầng / lưu trữ hóa đơn mỗi tháng. Làm sao? Chúng ta hãy đi đến đó.

Bốn loại tối ưu hóa

Theo tôi, tối ưu hóa có thể được thực hiện ở bốn cấp độ khác nhau (khi nói đến các ứng dụng PHP, nghĩa là):

  1. Trình độ ngôn ngữ: Điều này có nghĩa là bạn sử dụng phiên bản ngôn ngữ nhanh hơn và tránh các tính năng / kiểu mã hóa cụ thể trong ngôn ngữ khiến mã của bạn chậm.
  2. Cấp khung Đây là những điều chúng tôi sẽ đề cập trong bài viết này.
  3. Cấp cơ sở hạ tầng: Điều chỉnh trình quản lý quy trình PHP, máy chủ web, cơ sở dữ liệu, v.v..
  4. Cấp phần cứng: Chuyển đến một nhà cung cấp dịch vụ lưu trữ phần cứng tốt hơn, nhanh hơn, mạnh hơn.

Tất cả các loại tối ưu hóa này đều có vị trí của chúng (ví dụ: tối ưu hóa php-fpm khá quan trọng và mạnh mẽ). Nhưng trọng tâm của bài viết này sẽ là tối ưu hóa hoàn toàn loại 2: những thứ liên quan đến khung.

Nhân tiện, không có lý do nào đằng sau việc đánh số, và nó không phải là một tiêu chuẩn được chấp nhận. Tôi chỉ làm những điều này lên. Xin đừng bao giờ báo giá cho tôi và nói, chúng tôi cần tối ưu hóa loại 3 trên máy chủ của chúng tôi, nhóm hoặc nhóm trưởng của bạn sẽ giết bạn, tìm tôi và sau đó cũng giết tôi. ��

Và bây giờ, cuối cùng, chúng tôi đến vùng đất hứa.

Hãy nhận biết các truy vấn cơ sở dữ liệu n + 1

Vấn đề truy vấn n + 1 là một vấn đề phổ biến khi sử dụng ORM. Laravel có ORM mạnh mẽ của nó được gọi là Eloquent, rất đẹp, tiện lợi đến mức chúng ta thường quên nhìn vào những gì mà Lừa đang diễn ra.

Xem xét một kịch bản rất phổ biến: hiển thị danh sách tất cả các đơn đặt hàng được đặt bởi một danh sách khách hàng nhất định. Điều này khá phổ biến trong các hệ thống thương mại điện tử và bất kỳ giao diện báo cáo nào nói chung, nơi chúng tôi cần hiển thị tất cả các thực thể liên quan đến một số thực thể.

Trong Laravel, chúng ta có thể tưởng tượng một chức năng điều khiển thực hiện công việc như thế này:

lớp OrderContoder mở rộng Trình điều khiển
{
// …

chức năng công khai getAllByCustomers (Yêu cầu $ request, mảng $ ids) {
$ khách hàng = Khách hàng :: findMany ($ ids);
$ đơn hàng = thu thập (); // bộ sưu tập mới

foreach ($ khách hàng là $ khách hàng) {
$ đơn hàng = đơn hàng $->hợp nhất ($ khách hàng->đơn đặt hàng);
}

chế độ xem trả về (‘admin.reports.nings’, [‘order’ => $ đơn hàng]);
}
}

Ngọt! Và quan trọng hơn, thanh lịch, đẹp. ����

Thật không may, nó là một cách tồi tệ để viết mã trong Laravel.

Đây là lý do tại sao.

Khi chúng tôi yêu cầu ORM tìm kiếm các khách hàng cụ thể, một truy vấn SQL như thế này sẽ được tạo:

CHỌN * TỪ khách hàng WHERE id IN (22, 45, 34, …);

Mà chính xác như mong đợi. Kết quả là, tất cả các hàng trả về được lưu trữ trong bộ sưu tập $ khách hàng bên trong chức năng của bộ điều khiển.

Bây giờ chúng tôi lặp lại từng khách hàng một và nhận đơn đặt hàng của họ. Điều này thực hiện các truy vấn sau đây . . .

CHỌN * TỪ các đơn hàng WHERE customer_id = 22;

. . . nhiều lần có khách hàng.

Nói cách khác, nếu chúng tôi cần lấy dữ liệu đơn hàng cho 1000 khách hàng, tổng số truy vấn cơ sở dữ liệu được thực hiện sẽ là 1 (để tìm nạp tất cả dữ liệu của khách hàng) + 1000 (để tìm nạp dữ liệu đơn hàng cho mỗi khách hàng) = 1001. Điều này là tên n + 1 đến từ đâu.

Chúng ta có thể làm tốt hơn không? Chắc chắn rồi! Bằng cách sử dụng những gì được gọi là tải háo hức, chúng tôi có thể buộc ORM thực hiện THAM GIA và trả lại tất cả dữ liệu cần thiết trong một truy vấn duy nhất! Như thế này:

$ đơn hàng = Khách hàng :: findMany ($ ids)->với (‘đơn hàng’)->được();

Cấu trúc dữ liệu kết quả là một cấu trúc lồng nhau, chắc chắn, nhưng dữ liệu thứ tự có thể được trích xuất dễ dàng. Trong trường hợp này, truy vấn duy nhất là như thế này:

CHỌN * TỪ khách hàng THAM GIA đơn đặt hàng TRÊN khách hàng.id = order.customer_id WHERE khách hàng.id IN (22, 45, …);

Tất nhiên, một truy vấn duy nhất tốt hơn một nghìn truy vấn bổ sung. Hãy tưởng tượng điều gì sẽ xảy ra nếu có 10.000 khách hàng xử lý! Hoặc Chúa cấm nếu chúng tôi cũng muốn hiển thị các mục có trong mỗi đơn hàng! Hãy nhớ rằng, tên của kỹ thuật này rất háo hức và nó luôn luôn là một ý tưởng hay.

Cache cấu hình!

Một trong những lý do cho tính linh hoạt của Laravel, là hàng tấn tệp cấu hình là một phần của khung. Muốn thay đổi cách thức / nơi lưu trữ hình ảnh?

Chà, chỉ cần thay đổi tập tin config / filesystems.php (ít nhất là bằng văn bản). Bạn muốn làm việc với nhiều trình điều khiển hàng đợi? Hãy mô tả chúng trong config / queue.php. Tôi chỉ đếm và thấy rằng có 13 tệp cấu hình cho các khía cạnh khác nhau của khung, đảm bảo bạn đã thắng được thất vọng cho dù bạn muốn thay đổi điều gì.

Với bản chất của PHP, mỗi khi có yêu cầu Web mới xuất hiện, Laravel thức dậy, khởi động mọi thứ và phân tích tất cả các tệp cấu hình này để tìm ra cách thực hiện khác biệt lần này. Ngoại trừ việc nó rất ngu ngốc nếu không có gì thay đổi trong vài ngày qua! Việc xây dựng lại cấu hình theo mọi yêu cầu là một sự lãng phí có thể (thực sự là phải) tránh được và lối thoát là một lệnh đơn giản mà Laravel đưa ra:

Cấu hình nghệ nhân php: bộ đệm

Những gì nó làm là kết hợp tất cả các tệp cấu hình có sẵn vào một tệp duy nhất và bộ đệm nằm ở đâu đó để truy xuất nhanh. Lần tiếp theo có một yêu cầu Web, Laravel sẽ chỉ cần đọc tệp này và bắt đầu.

Điều đó nói rằng, bộ nhớ đệm cấu hình là một hoạt động cực kỳ tinh vi có thể nổ tung trên khuôn mặt của bạn. Gotcha lớn nhất là một khi bạn đã ban hành lệnh này, hàm env () gọi từ khắp mọi nơi trừ các tệp cấu hình sẽ trả về null!

Nó có ý nghĩa khi bạn nghĩ về nó. Nếu bạn sử dụng bộ nhớ đệm cấu hình, bạn sẽ nói với khung, bạn biết gì không, tôi nghĩ rằng tôi đã thiết lập mọi thứ độc đáo và tôi chắc chắn 100% tôi không muốn họ thay đổi. Nói cách khác, bạn không mong muốn môi trường ở trạng thái tĩnh, đó là những gì tệp .env dành cho.

Như đã nói, đây là một số quy tắc bộ nhớ đệm cấu hình, linh thiêng, không thể phá vỡ:

  1. Làm điều đó chỉ trên một hệ thống sản xuất.
  2. Chỉ làm điều đó nếu bạn thực sự, thực sự chắc chắn rằng bạn muốn đóng băng cấu hình.
  3. Trong trường hợp có lỗi xảy ra, hãy hoàn tác cài đặt với bộ đệm nghệ thuật php: xóa
  4. Xin cầu nguyện rằng những thiệt hại gây ra cho doanh nghiệp là không đáng kể!

Giảm các dịch vụ tự động tải

Để có ích, Laravel tải một tấn dịch vụ khi thức dậy. Chúng có sẵn trong tệp config / app.php như một phần của khóa mảng ‘nhà cung cấp’. Hãy để có một cái nhìn về những gì tôi có trong trường hợp của tôi:

/ *
|————————————————————————–
| Nhà cung cấp dịch vụ tự động tải
|————————————————————————–
|
| Các nhà cung cấp dịch vụ được liệt kê ở đây sẽ được tự động tải vào
| yêu cầu ứng dụng của bạn. Vui lòng thêm dịch vụ của riêng bạn vào
| mảng này để cấp chức năng mở rộng cho các ứng dụng của bạn.
|
* /

‘nhà cung cấp’ => [

/ *
* Nhà cung cấp dịch vụ khung của Laravel…
* /
Chiếu sáng \ Auth \ AuthServiceProvider :: class,
Chiếu sáng \ Broadcasting \ BroadcastServiceProvider :: class,
Chiếu sáng \ Bus \ BusServiceProvider :: class,
Chiếu sáng \ Cache \ CacheServiceProvider :: class,
Chiếu sáng \ Foundation \ Providers \ ConsoleSupportServiceProvider :: class,
Chiếu sáng \ Cookie \ CookieServiceProvider :: class,
Chiếu sáng \ Cơ sở dữ liệu \ Cơ sở dữ liệuServiceProvider :: class,
Chiếu sáng \ Mã hóa \ EncryptServiceProvider :: class,
Chiếu sáng \ Filesystem \ FilesystemServiceProvider :: class,
Chiếu sáng \ Foundation \ Providers \ FoundationServiceProvider :: class,
Chiếu sáng \ Hashing \ HashServiceProvider :: class,
Chiếu sáng \ Mail \ MailServiceProvider :: class,
Chiếu sáng \ Thông báo \ Thông báoServiceProvider :: class,
Chiếu sáng \ Phân trang \ PaginationServiceProvider :: class,
Chiếu sáng \ Pipeline \ PipelineServiceProvider :: class,
Chiếu sáng \ Queue \ QueueServiceProvider :: class,
Chiếu sáng \ Redis \ RedisServiceProvider :: class,
Chiếu sáng \ Auth \ Mật khẩu \ Mật khẩuResetServiceProvider :: class,
Chiếu sáng \ Phiên \ PhiênServiceProvider :: class,
Chiếu sáng \ Dịch \ DịchServiceProvider :: class,
Chiếu sáng \ Xác thực \ Xác thựcServiceProvider :: class,
Chiếu sáng \ View \ ViewServiceProvider :: class,

/ *
* Nhà cung cấp dịch vụ trọn gói…
* /

/ *
* Nhà cung cấp dịch vụ ứng dụng…
* /
Ứng dụng \ Nhà cung cấp \ AppServiceProvider :: class,
Ứng dụng \ Nhà cung cấp \ AuthServiceProvider :: class,
// Ứng dụng \ Nhà cung cấp \ BroadcastServiceProvider :: class,
Ứng dụng \ Nhà cung cấp \ EventServiceProvider :: class,
Ứng dụng \ Nhà cung cấp \ RouteServiceProvider :: class,

],

Một lần nữa, tôi đếm, và có 27 dịch vụ được liệt kê! Bây giờ, bạn có thể cần tất cả chúng, nhưng nó không có khả năng.

Chẳng hạn, hiện tại tôi đang xây dựng API REST, điều đó có nghĩa là tôi không cần Nhà cung cấp dịch vụ phiên, Nhà cung cấp dịch vụ xem, v.v. Và vì tôi đang làm một vài điều theo cách của mình và không tuân theo khung mặc định , Tôi cũng có thể vô hiệu hóa Nhà cung cấp dịch vụ xác thực, Nhà cung cấp dịch vụ phân trang, Nhà cung cấp dịch vụ dịch thuật, v.v. Nói chung, gần một nửa trong số này là không cần thiết cho trường hợp sử dụng của tôi.

Hãy nhìn lâu, chăm chỉ vào ứng dụng của bạn. Có cần tất cả các nhà cung cấp dịch vụ? Nhưng vì lợi ích của God, xin vui lòng không bình luận một cách mù quáng về các dịch vụ này và đẩy mạnh sản xuất! Chạy tất cả các bài kiểm tra, kiểm tra mọi thứ bằng tay trên máy dev và dàn, và rất hoang tưởng trước khi bạn bóp cò. ��

Hãy khôn ngoan với ngăn xếp trung gian

Khi bạn cần một số xử lý tùy chỉnh của yêu cầu Web đến, tạo một phần mềm trung gian mới là câu trả lời. Bây giờ, nó hấp dẫn để mở ứng dụng / http / Kernel.php và gắn phần mềm trung gian vào ngăn xếp web hoặc api; bằng cách đó, ứng dụng sẽ khả dụng trên ứng dụng và nếu nó không làm điều gì đó xâm phạm (chẳng hạn như đăng nhập hoặc thông báo).

Tuy nhiên, khi ứng dụng phát triển, bộ sưu tập phần mềm trung gian toàn cầu này có thể trở thành gánh nặng thầm lặng cho ứng dụng nếu tất cả (hoặc đa số) trong số này có mặt trong mọi yêu cầu, ngay cả khi không có lý do kinh doanh nào cho điều đó.

Nói cách khác, hãy cẩn thận với nơi bạn thêm / áp dụng một phần mềm trung gian mới. Có thể thuận tiện hơn để thêm một cái gì đó trên toàn cầu, nhưng hình phạt hiệu suất là rất cao trong thời gian dài. Tôi biết nỗi đau mà bạn phải trải qua nếu bạn áp dụng có chọn lọc phần mềm trung gian mỗi khi có Thay đổi mới, nhưng đó là một nỗi đau mà tôi đã sẵn sàng chấp nhận và đề nghị!

Tránh ORM (đôi khi)

Trong khi Eloquent làm cho nhiều khía cạnh của tương tác DB trở nên dễ chịu, nó đi kèm với chi phí tốc độ. Là một người lập bản đồ, ORM không chỉ phải tìm nạp các bản ghi từ cơ sở dữ liệu mà còn khởi tạo các đối tượng mô hình và hydrat hóa (điền chúng vào) chúng với dữ liệu cột.

Vì vậy, nếu bạn thực hiện $ users = User :: all () đơn giản và có 10.000 người dùng, khung sẽ lấy 10.000 hàng từ cơ sở dữ liệu và thực hiện 10.000 người dùng mới () và điền vào các thuộc tính của họ bằng dữ liệu liên quan . Đây là khối lượng công việc khổng lồ đang được thực hiện ở hậu trường và nếu cơ sở dữ liệu là nơi ứng dụng của bạn đang trở thành nút cổ chai, đôi khi bỏ qua ORM là một ý tưởng hay.

Điều này đặc biệt đúng đối với các truy vấn SQL phức tạp, trong đó bạn phải nhảy rất nhiều vòng và viết các bao đóng khi đóng và vẫn kết thúc bằng một truy vấn hiệu quả. Trong các trường hợp như vậy, thực hiện DB :: raw () và viết truy vấn bằng tay được ưu tiên.

Đi qua điều này nghiên cứu hiệu suất, ngay cả đối với các chèn đơn giản Eloquent chậm hơn nhiều khi số lượng hồ sơ tăng:

Sử dụng bộ nhớ đệm càng nhiều càng tốt

Một trong những bí mật được giữ tốt nhất của tối ưu hóa ứng dụng Web là bộ nhớ đệm.

Đối với người không quen, bộ nhớ đệm có nghĩa là tính toán trước và lưu trữ các kết quả đắt tiền (tốn kém về sử dụng CPU và bộ nhớ) và chỉ cần trả lại chúng khi lặp lại cùng một truy vấn.

Chẳng hạn, trong một cửa hàng thương mại điện tử, có thể bắt gặp 2 triệu sản phẩm, hầu hết mọi người đều quan tâm đến những sản phẩm mới được lưu trữ, trong một phạm vi giá nhất định và cho một nhóm tuổi cụ thể. Truy vấn cơ sở dữ liệu về thông tin này rất lãng phí – vì truy vấn không thay đổi thường xuyên, nên tốt hơn là lưu trữ các kết quả này ở đâu đó để chúng tôi có thể truy cập nhanh chóng.

Laravel đã tích hợp hỗ trợ cho một số loại lưu trữ. Ngoài việc sử dụng trình điều khiển bộ đệm và xây dựng hệ thống bộ đệm từ đầu, bạn có thể muốn sử dụng một số gói Laravel tạo điều kiện mô hình lưu trữ, bộ nhớ đệm truy vấn, Vân vân.

Nhưng lưu ý rằng ngoài một trường hợp sử dụng được đơn giản hóa nhất định, các gói bộ nhớ đệm dựng sẵn có thể gây ra nhiều vấn đề hơn chúng giải quyết.

Thích bộ nhớ đệm trong bộ nhớ

Khi bạn lưu trữ một cái gì đó trong Laravel, bạn có một số tùy chọn về nơi lưu trữ tính toán kết quả cần được lưu trữ. Các tùy chọn này còn được gọi là trình điều khiển bộ đệm. Vì vậy, mặc dù có thể và hoàn toàn hợp lý khi sử dụng hệ thống tệp để lưu trữ kết quả bộ đệm, nhưng nó không thực sự có nghĩa là bộ đệm..

Lý tưởng nhất là bạn muốn sử dụng bộ nhớ cache trong bộ nhớ (sống hoàn toàn trong RAM) như Redis, Memcached, MongoDB, v.v., để dưới tải cao hơn, bộ nhớ đệm phục vụ cho việc sử dụng quan trọng thay vì trở thành nút cổ chai.

Bây giờ, bạn có thể nghĩ rằng có một ổ đĩa SSD gần giống như sử dụng thanh RAM, nhưng nó thậm chí không đóng. Ngay cả không chính thức điểm chuẩn cho thấy RAM vượt trội hơn SSD tới 10-20 lần khi nói về tốc độ.

Hệ thống yêu thích của tôi khi nói đến bộ nhớ đệm là Redis. Nó là lố bịch (100.000 thao tác đọc mỗi giây là phổ biến) và đối với các hệ thống bộ đệm rất lớn, có thể được phát triển thành một cụm dễ dàng.

Cache các tuyến đường

Cũng giống như cấu hình ứng dụng, các tuyến don don thay đổi nhiều theo thời gian và là một ứng cử viên lý tưởng cho bộ nhớ đệm. Điều này đặc biệt đúng nếu bạn có thể lồng các tệp lớn như tôi và cuối cùng chia tách web.php và api.php của bạn qua một số tệp. Một lệnh Laravel duy nhất gói tất cả các tuyến đường có sẵn và giữ cho chúng thuận tiện cho việc truy cập trong tương lai:

Tuyến nghệ nhân php: bộ đệm

Và khi bạn kết thúc việc thêm hoặc thay đổi tuyến đường, chỉ cần thực hiện:

lộ trình nghệ nhân php: rõ ràng

Tối ưu hóa hình ảnh và CDN

Hình ảnh là trái tim và linh hồn của hầu hết các ứng dụng Web. Thật trùng hợp, họ cũng là người tiêu dùng băng thông lớn nhất và là một trong những lý do lớn nhất cho các ứng dụng / trang web chậm. Nếu bạn chỉ lưu trữ những hình ảnh được tải lên một cách ngây thơ trên máy chủ và gửi lại chúng trong các phản hồi HTTP, thì bạn đã để một cơ hội tối ưu hóa lớn trôi qua.

Đề nghị đầu tiên của tôi là không lưu trữ hình ảnh cục bộ – có vấn đề về mất dữ liệu và tùy thuộc vào khu vực địa lý mà khách hàng của bạn đang ở, việc truyền dữ liệu có thể bị chậm một cách khó khăn.

Thay vào đó, hãy tìm một giải pháp như Đám mây tự động thay đổi kích thước và tối ưu hóa hình ảnh một cách nhanh chóng.

Nếu điều đó không thể, hãy sử dụng một cái gì đó như Cloudflare để lưu trữ và phục vụ hình ảnh trong khi chúng được lưu trữ trên máy chủ của bạn.

Và nếu thậm chí điều đó là không thể, việc tinh chỉnh phần mềm máy chủ web của bạn một chút để nén tài sản và hướng trình duyệt của khách truy cập vào bộ nhớ cache, tạo ra nhiều sự khác biệt. Đây là một đoạn cấu hình Nginx trông như thế nào:

người phục vụ {

# tập tin bị cắt ngắn

# gzip cài đặt nén
gzip trên;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied bất kỳ;
gzip_vary trên;

# kiểm soát bộ nhớ cache của trình duyệt
vị trí ~ * \. (ico | css | js | gif | jpeg | jpg | png | woff | ttf | otf | svg | woff2 | eot) $ {
hết hạn 1ngày;
access_log tắt;
add_header Pragma công khai;
add_header Kiểm soát bộ đệm "công khai, tuổi tối đa = 86400";
}
}

Tôi nhận thức được rằng tối ưu hóa hình ảnh không liên quan gì đến Laravel, nhưng nó là một thủ thuật đơn giản và mạnh mẽ (và thường bị bỏ qua) mà không thể giúp tôi.

Tối ưu hóa trình tải tự động

Tự động tải là một tính năng gọn gàng, không quá cũ trong PHP có thể lưu ngôn ngữ khỏi sự diệt vong. Điều đó nói rằng, quá trình tìm và tải lớp có liên quan bằng cách giải mã một chuỗi không gian tên đã cho cần có thời gian và có thể tránh được trong các triển khai sản xuất nơi mà hiệu suất cao là mong muốn. Một lần nữa, Laravel có một giải pháp đơn lệnh cho việc này:

trình soạn thảo cài đặt –optizes-autoloader –no-dev

Kết bạn với hàng đợi

Hàng đợi là cách bạn xử lý mọi thứ khi có nhiều trong số chúng, và mỗi trong số chúng mất vài mili giây để hoàn thành. Một ví dụ điển hình là gửi email – trường hợp sử dụng rộng rãi trong các ứng dụng web là loại bỏ một vài email thông báo khi người dùng thực hiện một số hành động.

Chẳng hạn, trong một sản phẩm mới ra mắt, bạn có thể muốn lãnh đạo công ty (khoảng 6-7 địa chỉ email) được thông báo mỗi khi ai đó đặt hàng trên một giá trị nhất định. Giả sử rằng cổng email của bạn có thể đáp ứng yêu cầu SMTP của bạn sau 500ms, chúng tôi đang nói về sự chờ đợi 3-4 giây tốt cho người dùng trước khi xác nhận đơn hàng bắt đầu. Một phần UX thực sự tồi tệ, tôi chắc chắn bạn sẽ đồng ý.

Biện pháp khắc phục là lưu trữ các công việc khi chúng đến, nói với người dùng rằng mọi thứ đều ổn và xử lý chúng (một vài giây) sau đó. Nếu có một lỗi xảy ra, các công việc được xếp hàng có thể được thử lại một vài lần trước khi chúng được tuyên bố là không thành công.

Tín dụng: Microsoft.com

Mặc dù một hệ thống xếp hàng làm phức tạp thiết lập một chút (và thêm một số chi phí giám sát), nhưng nó không thể thiếu trong một ứng dụng Web hiện đại.

Tối ưu hóa tài sản (Hỗn hợp Laravel)

Đối với bất kỳ tài sản ngoại vi nào trong ứng dụng Laravel của bạn, vui lòng đảm bảo rằng có một đường ống biên dịch và thu nhỏ tất cả các tệp nội dung. Những người cảm thấy thoải mái với hệ thống đóng gói như Webpack, Gulp, Parcel, v.v., thì don cần phải bận tâm, nhưng nếu bạn không làm điều này, Hỗn hợp rốn là một khuyến nghị vững chắc.

Mix là một trình bao bọc gọn nhẹ (và thú vị, hoàn toàn trung thực!) Xung quanh Webpack, nó sẽ chăm sóc tất cả các tệp CSS, SASS, JS, v.v. của bạn để sản xuất. Một tệp .mix.js điển hình có thể nhỏ như thế này và vẫn hoạt động kỳ diệu:

const mix = Yêu cầu (‘laravel-mix’);

mix.js (‘resource / js / app.js’, ‘public / js’)
.sass (‘resource / sass / app.scss’, ‘public / css’);

Điều này tự động đảm nhiệm việc nhập khẩu, thu nhỏ, tối ưu hóa và toàn bộ shebang khi bạn đã sẵn sàng để sản xuất và chạy npm chạy sản xuất. Mix không chỉ chăm sóc các tệp CSS và CSS truyền thống mà cả các thành phần Vue và React mà bạn có thể có trong quy trình làm việc của ứng dụng.

Thêm thông tin đây!

Phần kết luận

Tối ưu hóa hiệu suất là nghệ thuật nhiều hơn khoa học – biết làm thế nào và bao nhiêu để làm là quan trọng hơn những gì phải làm. Điều đó nói rằng, không có kết thúc với bao nhiêu và tất cả những gì bạn có thể tối ưu hóa trong một ứng dụng Laravel.

Nhưng bất cứ điều gì bạn làm, tôi muốn để lại cho bạn một số lời khuyên chia tay – tối ưu hóa nên được thực hiện khi có lý do chắc chắn, và không phải vì nó nghe có vẻ hay vì bạn hoang tưởng về hiệu suất ứng dụng cho hơn 100.000 người dùng trong khi thực tế chỉ có 10.

Nếu bạn không chắc chắn liệu bạn có cần tối ưu hóa ứng dụng của mình hay không, thì bạn không cần phải đá tổ ong tục ngữ. Một ứng dụng hoạt động cảm thấy nhàm chán nhưng thực hiện chính xác những gì nó phải mong muốn gấp mười lần so với một ứng dụng đã được tối ưu hóa thành một siêu mẫu lai đột biến nhưng sau đó lại thất bại.

Và, để newbiew trở thành bậc thầy của Laravel, hãy xem điều này khóa học trực tuyến.

Có thể ứng dụng của bạn chạy nhiều, nhanh hơn nhiều! ��

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me