Czy Laravel naprawdę jest tak wolny?

83

Właśnie zacząłem używać Laravel. Prawie nie napisałem żadnego kodu, ale ładowanie moich stron trwa prawie sekundę!

laravel timings

Jest to dla mnie trochę szokujące, gdy moje aplikacje bez frameworka i aplikacje NodeJS zajmują ~ 2 ms. Co robi Laravel? To nie jest normalne zachowanie, prawda? Czy to wymaga dopracowania?

mpen
źródło
6
Spróbuj pobiecphp artisan optimize --force
Joseph Silber
13
Aby być uczciwym, widoczne czasy ładowania są w trybie debugowania. Pasek debugowania, którego używasz, znacznie spowalnia aplikację.
kajetons
4
Jak wygląda Twoje otoczenie? Widzę większe prędkości na VPS w porównaniu do tego, jak pracuję lokalnie na maszynie wirtualnej.
kreeves
2
@Artsemis Właśnie zainstalowałem wszystko. Jest ponad dwukrotnie wolniejszy i ulega awarii po kilku odświeżeniach.
mpen
9
Tak, nie licz na nic szybko, używając Vagrant. Strona Symfony zazwyczaj ładuje się w Vagrant w ciągu 1-2 sekund, podczas gdy produkcja zajmuje 50 ms.
Matthieu Napoli

Odpowiedzi:

98

Laravel jest nie faktycznie , że powolny. 500-1000 ms to absurd; Zmniejszyłem to do 20 ms w trybie debugowania.

Problem dotyczył folderów współdzielonych Vagrant / VirtualBox +. Nie zdawałem sobie sprawy, że otrzymali taki hit wydajnościowy. Wydaje mi się, że ponieważ Laravel ma tak wiele zależności (ładuje ~ 280 plików) i każdy z tych plików odczytuje wolno, sumuje się naprawdę szybko.

kreeves wskazał mi właściwy kierunek, ten wpis na blogu opisuje nową funkcję w Vagrant 1.5, która pozwala na rsynchronizację plików z maszyną wirtualną zamiast korzystania z folderu współdzielonego.

W systemie Windows nie ma natywnego klienta rsync, więc będziesz musiał użyć cygwin . Zainstaluj go i pamiętaj o zaznaczeniu opcji Net / rsync. Dodaj C:\cygwin64\bindo swoich ścieżek. [Lub możesz zainstalować go na Win10 / Bash]

Vagrant przedstawia nową funkcję . Używam Puphet, więc mój plik Vagrantfile wygląda trochę śmiesznie. Musiałem to poprawić, aby wyglądało tak:

  data['vm']['synced_folder'].each do |i, folder|
    if folder['source'] != '' && folder['target'] != '' && folder['id'] != ''
      config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", 
        id: "#{folder['id']}", 
        type: "rsync",
        rsync__auto: "true",
        rsync__exclude: ".hg/"
    end
  end

Gdy wszystko będzie gotowe, spróbuj vagrant up. Jeśli wszystko pójdzie gładko, komputer powinien się uruchomić i skopiować wszystkie pliki. Aby vagrant rsync-autopliki były aktualne, musisz uruchomić terminal. Zapłacisz trochę za opóźnienie, ale przy 30-krotnie szybszym ładowaniu strony warto!


Jeśli używasz PhpStorm, jego funkcja automatycznego przesyłania działa nawet lepiej niż rsync. PhpStorm tworzy wiele plików tymczasowych, które mogą spowodować błąd obserwatorów plików, ale jeśli pozwolisz mu samodzielnie obsłużyć przesyłanie, działa dobrze.


Jeszcze jedną opcją jest użycie lsyncd . Odniosłem wielki sukces, używając tego na hoście Ubuntu -> gość FreeBSD. Nie próbowałem jeszcze tego na hoście Windows.

mpen
źródło
Co zrobiłeś, aby poprawić swoją wydajność (oprócz używania rsync)?
jpcamara
2
@jpcamara Nothing. Sam Rsync obniżył to do ~ 20 ms. Możesz go uruchomić pod HHVM, wyłączyć debugowanie i uruchomić, artisan optimizeaby uzyskać niewielkie przyspieszenie. Reszta dotyczy głównie tego, jak projektujesz aplikację. Zainstaluj barryvdh/laravel-debugbari poszukaj powolności.
mpen
2
Jak ładuje 280 plików w 20 ms? Użyto jakiejś kompilacji / OPcache? Zakładając pamięć SSD, ofc.
Manuel Arwed Schmidt
1
Według Taylora Otwella, Laravel 5.2 będzie szybszy nawet o 25%: twitter.com/taylorotwell/status/674327734252892161
Koga
1
Użyj udostępniania plików NFS zamiast domyślnego. Przyspiesza wszystko 10 razy ... Zmodyfikuj plik Vagrant, aby wymusić zamontowanie systemu plików jako NFS: config.vm.synced_folder ".", "/ Vagrant", wpisz: "nfs", nfs: true, nfs_udp: false, nfs_version: 3
Didzis
25

Aby pomóc Ci rozwiązać Twój problem, znalazłem ten blog, który mówi o optymalizacji produkcji laravel. Większość tego, co musisz zrobić, aby Twoja aplikacja była szybka, zależy teraz od wydajności kodu, przepustowości sieci, CDN, pamięci podręcznej, bazy danych.

Teraz opowiem o problemie:

Laravel jest powolny po wyjęciu z pudełka. Istnieją sposoby, aby to zoptymalizować. Masz również możliwość korzystania z buforowania w swoim kodzie, ulepszając swój serwer, yadda yadda yadda. Ale ostatecznie Laravel jest nadal powolny.

Laravel używa wielu bibliotek symfony i jak widać w testach porównawczych techempower , symfony plasuje się bardzo nisko (co najmniej). Można nawet stwierdzić, że benchmark laravela znajduje się prawie na dole.

W tle dzieje się dużo automatycznego ładowania, a rzeczy, których możesz nawet nie potrzebować, są ładowane. Tak więc technicznie, ponieważ laravel jest łatwy w użyciu, pomaga w szybkim tworzeniu aplikacji, a także spowalnia.

Ale nie mówię, że Laravel jest zły, jest świetny , świetny w wielu rzeczach. Ale jeśli spodziewasz się dużego wzrostu ruchu, będziesz potrzebować znacznie więcej sprzętu tylko do obsługi żądań. Kosztowałoby to dużo więcej. Ale jeśli jesteś obrzydliwie bogaty, z Laravelem możesz osiągnąć wszystko. :RE

Zwykły kompromis:

 Easy = Slow, Hard = Fast

Uważam, że C lub Java mają trudną krzywą uczenia się i trudną konserwację, ale zajmują bardzo wysokie miejsce w frameworkach internetowych.

Choć niezbyt spokrewnione. Próbuję tylko udowodnić, że easy = slow:

Ruby ma bardzo dobrą reputację pod względem łatwości utrzymania i łatwości w nauce, ale jest również uważany za najwolniejszy wśród Pythona i PHP, jak pokazano tutaj .

wprowadź opis obrazu tutaj

majidarif
źródło
91
co ta grafika ma wspólnego z pytaniem?
NullPoiиteя
4
PHP7 jest dużo szybsze niż PHP5
Cobolt
1
O co chodzi? Łatwy = wolny, tylko dalej szerzy nieuzasadnione nieporozumienia w odniesieniu do poszczególnych języków
Chris
w infografiki jeden błąd, że Pyhon nie może być pod wpływem Java java ponieważ został wynaleziony w 1995 i 1991 roku w python
Haritsinh Gohil
@HaritsinhGohil Python 3 został wydany w 2008 roku.
majidarif
17

Tak - Laravel JEST naprawdę powolny. Z tego powodu stworzyłem aplikację POC. Prosty router z formularzem logowania. Mogłem uzyskać tylko 60 RPS przy 10 jednoczesnych połączeniach na cyfrowym serwerze oceanicznym za 20 USD (kilka GB pamięci RAM);

Ustawiać:

2gb RAM
Php7.0
apache2.4
mysql 5.7
memcached server (for laravel session)

Przeprowadziłem optymalizacje, automatyczne ładowanie zrzutu kompozytora itp., I faktycznie obniżyłem RPS do 43-ish .

Problem polega na tym, że aplikacja odpowiada w 200-400 ms. Uruchomiłem test AB z lokalnego komputera, na którym laravel był włączony (tj. Nie przez ruch internetowy); i mam tylko 112 RPS; z 200 ms szybszym czasem odpowiedzi ze średnią 300 ms.

Dla porównania przetestowałem moją produkcyjną aplikację natywną PHP obsługującą kilka milionów żądań dziennie na AWS t2.medium (x3, zrównoważone obciążenie). Kiedy miałem 25 jednoczesnych połączeń z mojego lokalnego komputera do tego przez Internet, przez ELB, otrzymałem około 1200 RPS. Ogromna różnica między maszyną z obciążeniem a stroną "logowania" laravel.

Są to strony z sesjami (flexibleache / memcached), wyszukiwania Live DB (zapytania w pamięci podręcznej przez memcached), zasoby ściągnięte przez CDN itp., Itd.

Co mogę powiedzieć, laravel wytrzymuje około 200-300 ms obciążenia. W końcu jest to dobre dla widoków generowanych przez PHP, w końcu ten typ opóźnienia jest tolerowany podczas ładowania. Jednak w przypadku widoków PHP, które używają Ajax / JS do obsługi małych aktualizacji, zaczyna się to wydawać powolne.

Nie mogę sobie wyobrazić, jak ten system wyglądałby z aplikacją obsługującą wiele dzierżawców, podczas gdy 200 botów indeksuje 100 stron jednocześnie.

Laravel doskonale nadaje się do prostych aplikacji. Lumen jest tolerowany, jeśli nie musisz robić niczego wymyślnego, co wymagałoby bzdury z oprogramowaniem pośredniczącym (IE, brak aplikacji dla wielu dzierżawców i domen niestandardowych itp.);

Jednak nigdy nie lubię zaczynać od czegoś, co może wiązać się i powodować 300 ms obciążenia dla posta „hello world”.

Jeśli myślisz „Kogo to obchodzi?”

.. Napisz wyszukiwanie predykcyjne, które opiera się na szybkich zapytaniach odpowiadających na sugestie autouzupełniania w kilkuset tysiącach wyników. To opóźnienie 200-300 ms doprowadzi twoich użytkowników do absolutnego szaleństwa.

Nacięcie
źródło
2
Dlaczego oprogramowanie pośredniczące jest bezsensowne? Chcesz wyjaśnić faktami, abyśmy wszyscy mogli stwierdzić, że to nonsens? Ponadto uruchamiam instalację Laravel, która szczęśliwie odpowiada między 80 a 65 ms (tak, wykonuje zapytanie db na 4 miliardy rekordów tabeli), więc chcę zobaczyć, o co ci chodzi.
Mjh
2
Oczywiście kochasz laravel. Skonfigurowałem instalację podstawową, zoptymalizowałem i otrzymałem słabe wyniki. Okazało się, że wymaga oprogramowania pośredniczącego i inżynierii wstecznej do obsługi przetwarzania przed trasą; co nie było idealne. Świetnie, tylko dlatego, że masz „TWOJĄ” instalację programu laravel w celu optymalizacji. To nieistotne. Podstawowy pakiet routingu HELLO WORLD był znacznie cięższy i wolniejszy niż prosty framework routingu i silnik szablonów twig. Czy można zapisać je w pamięci podręcznej? Zoptymalizowany? Ulepszony? Tak. Czy o to chodzi? Nie. Laravel jest ciężki. Ciężki jest powolny. Świat się z tym zgadza. używaj go, jeśli ci się podoba, ale to nie jest teologia. :)
Nick
1
Uwielbiam spędzać mniej czasu. Nie obchodzi mnie framework / technologia / cokolwiek, zakładam, że jesteś taki sam. Mniej czasu spędzonego na osiągnięciu celu = to wygrana w mojej książce. Tak, Laravel jest ciężki. Każdy framework jest ciężki w porównaniu do prostego języka. Jak każdy program / oprogramowanie - Laravel może działać szybko, co jest celem mojego komentarza. Jeśli framework Ci pomaga, jeśli chcesz, aby działał szybciej - to jest osiągalne.
Mjh
Porównujesz nieskonfigurowaną / zoptymalizowaną / buforowaną instancję Laravel działającą na serwerze o wartości 20 USD DO z niestandardową kompilacją, wysoce dostrojoną / zoptymalizowaną / buforowaną aplikacją php, działającą na wysoce dostrojonej / zoptymalizowanej / buforowanej infrastrukturze serwerowej za 400 USD, a następnie narzekasz, że niezoptymalizowana aplikacja działa wolno? Nie zrozum mnie źle, WSZYSTKIE frameworki są powolne po wyjęciu z pudełka! Nie ma sposobu, aby dostroić framework do pracy dla wszystkich. Ponadto większość frameworków jest konfigurowanych w PIERWSZYM środowisku programistycznym. Powolne ładowanie automatyczne, szablony niebuforowane itp. Proszę porównać jabłko z jabłkiem, a nie jabłko z Ferrari, lub w tym przypadku
Zondą
2
CodeIgniter nie jest powolny po wyjęciu z pudełka. W rzeczywistości CodeIgniter jest prawie tak szybki jak sam PHP. PHP = 300 rps, CodeIgniter = 295. Laravel jest znacznie niższy. Zend ma około 30 rps, a ciasto, z tego co pamiętam, aż 3 rps. Żadne dwie ramy nie są sobie równe. Jest kilka jabłek do obejrzenia. Jednak optymalizacja Laravel może spowodować obciążenie 60 ms, wyobraź sobie, co zapewniłaby optymalizacja CodeIgniter. ;)
Webmaster G
13

Odkryłem, że największy wzrost szybkości dzięki Laravel 4 można osiągnąć wybierając odpowiednie sterowniki sesyjne;

Sessions "driver" file;

Requests per second:    188.07 [#/sec] (mean)
Time per request:       26.586 [ms] (mean)
Time per request:       5.317 [ms] (mean, across all concurrent requests)


Session "driver" database;

Requests per second:    41.12 [#/sec] (mean)
Time per request:       121.604 [ms] (mean)
Time per request:       24.321 [ms] (mean, across all concurrent requests)

Mam nadzieję, że to pomoże

Hydrino
źródło
1
To oczywiste i polecam każdemu, aby nigdy nie używał pliku jako sesji. Pomyśl o skalowalności :)
jeveloper
6
@jeveloper what? W tym przykładzie plik jest ponad 4 razy szybszy niż baza danych
developerbmw
1
@Brett "myśl o skalowalności" był sednem sprawy, pewny plik vs połączenia sieciowe do prawdopodobnie zdalnej maszyny (nawet jeśli jest w tym samym VPC) byłyby wolniejsze, ale przynajmniej trwałe i przechwytujesz dane sesji
jeveloper
@jeveloper czy system plików nie jest zrównoważony? Mam nadzieję, że tak jest, ponieważ i tak jest to podstawowa pamięć dla większości baz danych.
developerbmw
3
@developerbmw To, co próbuje powiedzieć, to to, że jeśli masz loadbalancer i wiele instancji obsługujących twoją aplikację, użycie systemu plików lokalnego serwera nie jest skalowalne.
Chris Harrison,
10

Z mojego konkursu Hello World, który to Laravel? Myślę, że możesz zgadnąć. Do testu użyłem kontenera docker i oto wyniki

Aby wysłać odpowiedź http „Hello World”:

  • Golang z obsługą logów stdout: 6000 rps
  • SpringBoot z obsługą logów: 3600 obr / s
  • Laravel 5 z wylogowaniem: 230 rps
Aggarat .J
źródło
Nie wiem, dlaczego zostało to oznaczone jako własne, tak, może bardziej odpowiednie jako komentarz. Chociaż doświadczam również WYJĄTKOWO powolnego czasu odpowiedzi w kontenerze
docker
czy próbowałeś buforować trasy?
Oğuz Can Sertel
co to jest rps? żądań na sekundę?
user3494047
3
Hello world to najlepsza i najbardziej użyteczna aplikacja w historii, zwłaszcza gdy jest używana do znaczących testów. Całkowicie obejmuje wszystko, co musisz wiedzieć, z którego składnika jest używany do obsługi pakietu / menedżera pakietów dla języka.
Mjh
1
Chcę tylko linii bazowej wydajności bez innych skomplikowanych zależności
Aggarat .J
5

Używam Laravel dość często i po prostu nie wierzę liczbom, które mi mówi, ponieważ renderowanie od końca do końca mierzone przez moją przeglądarkę pokazuje NIŻSZY całkowity czas od żądania do gotowości.

Co więcej, uzyskuję nieco wyższe liczby na moim komputerze w pracy, co powoduje, że strona jest wykonywana zauważalnie szybciej niż mój komputer w domu.

Nie wiem, jak te liczby są obliczane, ale nie są potwierdzane przez obserwacje ani narzędzia przeglądarki, takie jak Firebug ...

Laravel nie jest wcale taki wolny, zwłaszcza po optymalizacji. Jest jednak głodny pamięci. Nawet ciężki CMS, taki jak Drupal, który jest bardzo powolny, wydaje się mieć około 1/3 miejsca w pamięci żądania gołego kości Laravel.

W związku z tym, aby uruchomić Laravel w środowisku produkcyjnym, wdrożyłbym je na serwerach zoptymalizowanych pod kątem pamięci przed serwerami zoptymalizowanymi pod kątem procesora.

AgmLauncher
źródło
Nie jestem pewien, czy te liczby są trafne, ale zdecydowanie jest to zauważalne. Co masz na myśli, mówiąc „szczególnie w przypadku optymalizacji”? Jak go optymalizujesz? Po prostu biegając, php artisan optimizeczy możemy zrobić więcej?
mpen
3

Wiem, że to trochę stare pytanie, ale wszystko się zmieniło. Laravel nie jest taki powolny. Jak już wspomniano, synchronizowane foldery działają wolno. Jednak w systemie Windows 10 nie mogłem użyć rsync. Próbowałem obu cygwini minGW. Wygląda na to, że rsyncjest niezgodny z git for windowswersją programu ssh.

Oto, co zadziałało dla mnie: NFS .

Vagrant Docs mówi:

Foldery NFS nie działają na hostach Windows. Vagrant zignoruje Twoje żądanie dotyczące synchronizowanych folderów NFS w systemie Windows.

To już nie jest prawda. Obecnie możemy korzystać z vagrant-winnfsd wtyczki . Instalacja jest naprawdę prosta:

  1. Wykonać vagrant plugin install vagrant-winnfsd
  2. Zmień swoje Vagrantfile:config.vm.synced_folder ".", "/vagrant", type: "nfs"
  3. Dodaj do Vagrantfile:config.vm.network "private_network", type: "dhcp"

To wszystko, czego potrzebowałem do NFSpracy. Czas odpowiedzi Laravel zmniejszył się dla mnie z 500 ms do 100 ms.

frutalność
źródło
Czy próbowałeś rsync przez Bash dla Windows? Właściwie to teraz uruchomię i działa świetnie.
mpen
Nie, nie próbowałem. Wiem, wiele osób pisze, że rsync działa również świetnie z git bash lub Windows cmd. Nie wiem, dlaczego mi to nie działa. Ale i tak znalazłem inne rozwiązanie. Może komuś się przyda.
frutality
1

Zmierzyłem się 1.40spodczas pracy z czystym laravelem w obszarze deweloperskim!

problem polegał na użyciu: php artisan servedo uruchomienia serwera WWW

kiedy zamiast tego użyłem serwera WWW Apache (lub NGINX) dla tego samego kodu, do którego go sprowadziłem 153ms

soheil yo
źródło
1

Ponieważ nikt inny o tym nie wspomniał, stwierdziłem, że debugger xdebug radykalnie wydłużył czas. Obsłużyłem podstawową dynamiczną stronę „Hello World, the time is 2020-01-01T01: 01: 01.010101” i użyłem tego w moim httpd.conf do określenia czasu żądania:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" **%T/%D**" combined

% T to czas serwowania w sekundach,% D to czas w mikrosekundach. Z tym w moim php.ini:

[XDebug]
xdebug.remote_autostart = 1
xdebug.remote_enable = 1

Czas odpowiedzi wynosił około 770 ms, ale przy obu ustawionych na 0, aby je wyłączyć, natychmiast przeskoczył do 160 ms. Uruchomienie obu zmniejszyło czas do 120 ms:

php artisan route:cache
php artisan config:cache

Wadą jest to, że gdybym wprowadził zmiany w konfiguracji lub trasie, musiałbym ponownie je buforować, co jest denerwujące.

Na marginesie, co dziwne, przeniesienie witryny z mojego dysku SSD na obracający się dysk twardy nie zapewniło żadnych korzyści w zakresie wydajności, co jest dla mnie bardzo dziwne, ale przypuszczam, że może być buforowane, jestem na Windows 10 z XAMPP.

turiyag
źródło
-11

Laravel jest powolny, ponieważ w większości przypadków używanie PHP dla stron internetowych jest powolne.

W Laravel cały framework jest przebudowywany przy każdym wywołaniu - dlatego wszystkie strony wskazują index.php. Ponieważ cały framework to skrypty PHP, wszystkie one muszą przejść przez interpreter PHP - za każdym razem. Im większa rama, tym dłużej to trwa.

Porównaj to ze „środowiskiem serwera” (np. Tomcat), w którym serwer uruchamia kod inicjalizacyjny raz i ostatecznie wszystkie strony będą w kodzie natywnym (po JIT).

Jako przykład odniesienia, używając tego samego sprzętu, systemu operacyjnego itp., Prosty „hello world” przy użyciu JSP na tym sprzęcie to 3000 rps, ten sam hello world na laravel to 51 rps.

Najłatwiejszym sposobem przetestowania obciążenia struktury i wynikającego z tego maksymalnego RPS na rdzeń jest użycie Apache AB i wartości współbieżności 1, z prostym „witaj świat”, który jest dynamiczny (aby uniknąć statycznego buforowania strony).

Robert Engels
źródło