Невже Ларавел так повільний?


82

Я щойно почав використовувати Laravel. Я ще майже не написав жодного коду, але завантаження моїх сторінок займає майже секунду!

laravel timings

Це трохи шокує мене, коли мої безрамкові програми та програми NodeJS займають ~ 2 мс. Що робить Ларавель? Це не нормальна поведінка, чи не так? Чи потрібна якась тонка настройка?


6
Спробуйте бігтиphp artisan optimize --force
Джозеф Сільбер,

13
Чесно кажучи, час завантаження, який ви бачите, перебуває в режимі налагодження. Налагоджувач, який ви використовуєте, досить уповільнює роботу програми.
kajetons

4
Як виглядає ваше оточення? Я бачу вищі швидкості на VPS порівняно з тим, що я розробляю локально на VM.
kreeves

2
@Artsemis Щойно встановив усе. Це більш ніж удвічі повільніше , і воно падає після декількох оновлень.
mpen

9
Так, не сподівайтеся ні на що швидко, використовуючи Vagrant. Сторінка Symfony зазвичай завантажується у Vagrant за 1-2 секунди, тоді як для виробництва потрібно 50 мс.
Matthieu Napoli

Відповіді:


98

Laravel насправді не такий повільний. 500-1000 мс - абсурд; Я отримав його до 20 мс у режимі налагодження.

Проблема полягала у спільних папках Vagrant / VirtualBox +. Я не підозрював, що вони зазнали такого вистави. Я думаю, оскільки Laravel має стільки залежностей (завантажує ~ 280 файлів), і кожен з цих файлів читається повільно, і це дуже швидко додається.

kreeves вказав мені у правильному напрямку, цей допис у блозі описує нову функцію у Vagrant 1.5, яка дозволяє вам синхронізувати файли у віртуальній машині, а не використовувати спільну папку.

У Windows немає власного клієнта rsync, тому вам доведеться використовувати cygwin . Встановіть його та переконайтеся, що ви поставили галочку на Net / rsync. Додайте C:\cygwin64\binдо своїх шляхів. [Або ви можете встановити його на Win10 / Bash]

Vagrant представляє нову функцію . Я використовую Puphet, тому мій файл Vagrant виглядає трохи смішно. Мені довелося його налаштувати, щоб виглядати так:

  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

Як тільки ви все налаштуєте, спробуйте vagrant up. Якщо все йде гладко, ваша машина повинна завантажитися, і вона повинна скопіювати всі файли. Вам потрібно буде запустити vagrant rsync-autoтермінал, щоб підтримувати актуальність файлів. Ви заплатите трохи затримки, але для швидшого завантаження сторінок у 30 разів це варто!


Якщо ви використовуєте PhpStorm, ця функція автоматичного завантаження працює навіть краще, ніж rsync. PhpStorm створює багато тимчасових файлів, які можуть відключити спостерігачів файлів, але якщо ви дозволите йому обробляти завантаження самостійно, це працює чудово.


Ще один варіант - використовувати lsyncd . Я мав великий успіх, використовуючи це на хості Ubuntu -> Гість FreeBSD. Я ще не пробував на хості Windows.


Що ви зробили для покращення продуктивності (крім використання rsync)?
jpcamara

2
@jpcamara Нічого. Лише Rsync зміг це до ~ 20 мс. Ви можете запустити його під HHVM, вимкнути будь-яку налагодження та запустити artisan optimizeдля невеликого підвищення. В іншому, я думаю, здебільшого як ви розробляєте свій додаток. Встановіть barryvdh/laravel-debugbarі шукайте будь-яку повільність.
mpen

2
Як завантажується 280 файлів за 20 мс? Тут використовується якась компіляція / OPcache? Припускаючи зберігання SSD, оф.
Мануель Арвад Шмідт,

1
За словами Тейлора Отуелла, Laravel 5.2 буде навіть на 25% швидшим: twitter.com/taylorotwell/status/674327734252892161
Кога,

1
Використовуйте спільний доступ до файлів NFS замість стандартного. Пришвидшує все в 10 разів ... Змініть файл Vagrant, щоб змусити монтувати файлову систему як NFS: config.vm.synced_folder ".", "/ Vagrant", тип: "nfs", nfs: true, nfs_udp: false, nfs_version: 3
Дідзіс

25

Щоб допомогти вам вирішити вашу проблему, я знайшов цей блог, який розповідає про оптимізацію виробництва ларавелу. Більша частина того, що вам потрібно зробити, щоб зробити ваш додаток швидким, тепер буде в руках того, наскільки ефективним є ваш код, ємність вашої мережі, CDN, кешування, база даних.

Зараз я поговорю про проблему:

Laravel повільно виходить з коробки. Є способи його оптимізації. Ви також маєте можливість використовувати кешування у своєму коді, покращуючи свою серверну машину, yadda yadda yadda. Але врешті-решт Laravel все ще повільний.

Laravel використовує багато бібліотек symfony, і, як ви можете бачити в орієнтирах techempower, symfony посідає дуже низьке місце (щонайменше останнє). Ви навіть можете виявити, що еталон laravel знаходиться майже внизу.

Багато автозавантаження відбувається у фоновому режимі, завантажуються речі, які можуть вам навіть не знадобитися. Тож технічно, оскільки laravel простий у використанні, він допомагає швидко створювати програми, а також робить його повільним.

Але я не кажу, що Laravel поганий, він чудовий , чудовий у багатьох речах. Але якщо ви очікуєте великого сплеску трафіку, вам знадобиться набагато більше обладнання лише для обробки запитів. Це обійдеться вам набагато дорожче. Але якщо ви забруднені багатіями, ви можете досягти чого завгодно за допомогою Laravel. : D

Звичайний компроміс:

 Easy = Slow, Hard = Fast

Я б вважав, що C або Java мають жорстку криву навчання та важку ремонтопридатність, але вона займає дуже високе місце в веб-рамках.

Хоча і не надто пов’язані. Я просто намагаюся довести суть easy = slow:

Ruby має дуже хорошу репутацію у ремонтопридатності та простоті вивчення, але він також вважається найповільнішим серед python та php, як показано тут .

введіть тут опис зображення


91
яке відношення має ця графіка до запитання?
NullPoiиteя

4
PHP7 набагато швидший, ніж PHP5
Коболт,

1
Який момент? Легко = повільно, ще більше поширює необґрунтоване непорозуміння щодо певних мов
Кріс,

в інфографіці одна помилка полягає в тому, що на Pyhon неможливо впливати Java, оскільки java була винайдена в 1995 році, а python в 1991 році.
Haritsinh Gohil

@HaritsinhGohil Python 3 був випущений 2008 р.
majidarif

17

Так - Laravel дійсно такий повільний. Я заради цього створив додаток POC. Простий маршрутизатор, з формою для входу. Я міг отримати лише 60 RPS при 10 одночасних підключеннях на цифровому океанському сервері в 20 доларів (кілька ГБ оперативної пам'яті);

Налаштування:

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

Я провів оптимізацію, автозавантаження композитора тощо, і це насправді знизило RPS до 43-ї .

Проблема полягає в тому, що програма реагує за 200-400 мс. Я провів тест AB на локальній машині laravel (тобто не через веб-трафік); і я отримав лише 112 RPS; з 200 мс швидшим часом відгуку в середньому 300 мс.

Порівняно, я протестував свій робочий додаток PHP Native, що запускає кілька мільйонів запитів на день, на AWS t2.medium (x3, збалансоване навантаження). Коли я провів AB одночасно 25 підключень від моєї локальної машини до цього через Інтернет, через ELB, я отримав приблизно 1200 RPS. Величезна різниця на машині з навантаженням порівняно зі сторінкою "входу" в laravel

Це сторінки із сеансами (elasticache / memcached), реальними пошуками БД (кешовані запити через memcached), активами, перетягнутими через CDN тощо тощо тощо.

Що я можу сказати, laravel тримає близько 200-300ms навантаження на речі. Це прекрасно для переглядів, згенерованих PHP, зрештою, такий тип затримки є допустимим при навантаженні. Однак для переглядів PHP, які використовують Ajax / JS для обробки невеликих оновлень, він починає відчувати себе млявим.

Я не уявляю, як би виглядала ця система з додатком для декількох орендарів, тоді як 200 ботів одночасно сканують по 100 сторінок.

Laravel чудово підходить для простих додатків. Lumen терпимий, якщо вам не потрібно робити нічого вигадливого, що вимагало б безглуздя проміжного програмного забезпечення (IE, відсутність додатків для декількох клієнтів, користувацькі домени тощо);

Однак мені ніколи не подобається починати з чогось, що може пов’язати і спричинити навантаження 300 мс для повідомлення "привіт світ".

Якщо ви думаєте "Хто піклується?"

.. Напишіть інтелектуальний пошук, який спирається на швидкі запити, щоб відповісти на пропозиції автозавершення у кількох сотнях тисяч результатів. Це відставання в 200-300 мс зведе ваших користувачів з розуму.


2
Чому проміжне програмне забезпечення - це нісенітниця? Хочете пояснити фактами, щоб усі ми могли стверджувати, що це нісенітниця? Крім того, я запускаю інсталяцію Laravel, яка радісно відповідає між 80 і 65 мс (так, він виконує запит db на 4 мільярди таблиць записів), тому я дуже хочу побачити, про що ви.
Mjh

2
Ви, очевидно, любите laravel. Я встановив базову установку, оптимізував і отримав погані результати. Я виявив, що для обробки попередньої маршрути потрібна проміжне програмне забезпечення та інверсна інженерія; що не було ідеально. Просто тому, що ви отримали "ВАШУ" установку laravel для оптимізації, чудово. Це неактуально. Базова маршрутизація пакетів HELLO WORLD була набагато важчою та повільнішою, ніж простий фреймворк маршрутизації та механізм шаблонування гілок. Чи можна обидва кешувати? Оптимізовано? Покращений? Так. У цьому суть? Ні. Laravel важкий. Важка повільна (е-е). Світ погоджується з цим. використовуйте, якщо вам подобається, але це не теологія. :)
Нік

1
Я люблю витрачати менше часу. Мені насправді байдуже до фреймворку / технології / чого завгодно, я припускаю, що ти однаковий. Менше часу, витраченого на досягнення мети = це перемога в моїй книзі. Зараз так, Laravel важкий. Кожен фреймворк важкий у порівнянні з мовою без костей. Як і будь-яка програма / програмне забезпечення - Laravel може працювати швидко, про що йдеться в моєму коментарі. Якщо фреймворк вам допомагає, якщо вам потрібно зробити його швидшим - це можна досягти.
Mjh

Ви порівнюєте неконфігурований / оптимізований / кешований екземпляр Laravel, що працює на сервері DO 20 доларів, із власною збіркою, високо налаштованим / оптимізованим / кешованим php-додатком, що працює на серверній інфраструктурі з високою налаштуванням / оптимізацією / кешованим сервером, а потім скаржиться, що неоптимізований додаток працює повільно? Не зрозумійте мене неправильно, ВСІ фреймворки повільні з коробки! Немає можливості налаштувати структуру, яка працюватиме для всіх. Крім того, більшість фреймворків встановлюються для середовища розробника ПЕРШИМ. Повільне автоматичне завантаження, некешовані шаблони тощо. Будь ласка, порівняйте яблуко з яблуком, а не яблуко з Ferrari, або в цьому випадку Zonda ...
jacobfogg

2
CodeIgniter не є повільним. Насправді CodeIgniter майже такий же швидкий, як і сам PHP. PHP = 300 об / хв, CodeIgniter = 295. Laravel значно нижче цього. Zend становить близько 30 об / хв, а торт, наскільки я пам’ятаю, колосальні 3 об / хв. Немає двох рівних фреймворків. Є кілька яблук, на які слід подивитися. Однак оптимізація Laravel може забезпечити завантаження 60 мс, уявіть, яка оптимізація CodeIgniter допоможе вам. ;)
Вебмайстер G

13

Я виявив, що найбільший приріст швидкості за допомогою Laravel 4 ви можете досягти, вибравши правильні драйвери сеансів;

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)

Сподіваюся, що це допомагає


1
Очевидно, і я рекомендую кожному ніколи не використовувати файл як сеанс. Подумайте про масштабованість :)
розробник

6
@ jeveloper що? У цьому прикладі файл у 4 рази швидший за базу даних
developerbmw

1
@Brett "подумай про масштабованість" була суть в тому, що файлові та мережеві дзвінки на можливо віддалену машину (навіть якщо вона знаходиться в тому ж VPC) були б повільнішими, але принаймні стійкими, і ти захоплюєш дані сеансу
jeveloper

@jeveloper чи файлова система не є стійкою? Я сподіваюся, що це так, оскільки це і так є основним сховищем для більшості баз даних.
developerbmw

3
@developerbmw Він намагається сказати, що якщо у вас є балансир навантаження та багато екземплярів, що обслуговують вашу програму, використання файлової системи локального сервера не є масштабованим.
Кріс Гаррісон

10

З мого конкурсу Hello World, який із них Laravel? Думаю, ви можете здогадатися. Я використовував докер-контейнер для тесту, і ось результати

Щоб зробити http-відповідь "Hello World":

  • Голанг з обробником журналу stdout: 6000 об / хв
  • SpringBoot з обробником журналу stdout: 3600 об / хв
  • Laravel 5 без журналу: 230 об / хв

Не знаю, чому це було позначено як власне, так, можливо, більш доречно як коментар. Хоча я також відчуваю НАДІЙНО повільний час відгуку в контейнері докера ~ 600 мс
AndrewMcLagan

ви пробували кешування маршрутів?
Oğuz Can Sertel

що таке rps? запитів в секунду?
user3494047

3
Hello world - найкращий та найкорисніший додаток, особливо коли він використовується для значущих тестів. Він повністю охоплює все, що вам потрібно знати, з якого компонента використовується для пакетування / підтримки менеджера пакунків для мови.
Mjh

1
Я просто хочу вихідний рівень роботи без іншої складної залежності
Aggarat .J

5

Я досить багато використовую Laravel, і я просто не вірю цифрам, які він мені повідомляє, оскільки наскрізний візуалізація, виміряна моїм браузером, показує нижчий загальний час від запиту до готовності.

Крім того, я отримую трохи більші цифри на своїй машині на роботі, що робить сторінку помітно швидше, ніж моя машина вдома.

Я не знаю, як обчислюються ці цифри, але вони не підтверджуються спостереженнями чи інструментами браузера, такими як Firebug ...

Laravel насправді не все так повільно, особливо при оптимізації. Однак пам'ятає пам'ять. Навіть така важка система управління вмістом, як Drupal, яка працює дуже повільно, здається, має приблизно 1/3 розміру пам'яті оголеного запиту Laravel.

Таким чином, щоб запустити Laravel у виробництві, я б розгорнув на серверах, оптимізованих для пам'яті, перед серверами, оптимізованими для процесора.


Я не впевнений, що ці цифри помітні, але це точно помітно. Що ви маєте на увазі під словом "особливо при оптимізації"? Як ви його оптимізуєте? Просто бігаючи php artisan optimizeчи ми можемо зробити більше?
mpen

Кілька речей, які ви можете зробити, описані в цих двох посиланнях: crynobone.com/posts/7/crunching-laravel-4-for-production-server | lutro.priv.no/posts/optimizing-for-production-with-laravel-4
AgmLauncher

3

Я знаю, що це трохи давнє запитання, але все змінилося. Laravel не такий повільний. Як уже згадувалося, синхронізовані папки працюють повільно. Однак у Windows 10 я не зміг користуватися rsync. Я спробував обидва cygwinі minGW. Здається, rsyncце несумісно з git for windowsросійською версією ssh.

Ось, що мені вдалося : NFS .

Vagrant docs каже:

Папки NFS не працюють на хостах Windows. Vagrant проігнорує ваш запит на синхронізовані папки NFS у Windows.

Це вже неправда. Сьогодні ми можемо використовувати vagrant-winnfsd плагін . Це дуже просто встановити:

  1. Виконати vagrant plugin install vagrant-winnfsd
  2. Змініть у своєму Vagrantfile:config.vm.synced_folder ".", "/vagrant", type: "nfs"
  3. Додати до Vagrantfile:config.vm.network "private_network", type: "dhcp"

Це все, що мені потрібно для NFSроботи. Час реакції Laravel для мене зменшився з 500 мс до 100 мс.


Ви пробували rsync через Bash для Windows? Насправді я запускаю це, і це чудово працює.
mpen

Ні, я не пробував. Я знаю, багато людей пишуть, що rsync чудово працює з git bash або windows cmd. Я не знаю, чому це не працює для мене. Але я все-таки знайшов інше рішення. Можливо, це було б корисно комусь.
frutality

1

Я стикався 1.40sпід час роботи з чистим ларавелем в області розробки!

проблема полягала в використанні: php artisan serveдля запуску веб-сервера

коли я використовував веб-сервер apache (або NGINX) замість того самого коду, до якого я дійшов 153ms


1

Оскільки ніхто про це не згадував, я виявив, що налагоджувач xdebug різко збільшив час. Я подав базову динамічну сторінку "Hello World, час 2020-01-01T01: 01: 01.010101" і використав це у своєму httpd.conf для часу запиту:

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

% T - час подачі в секундах,% D - час у мікросекундах. З цим у моєму php.ini:

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

Я отримував близько 770 мс часу відгуку, але з обома, встановленими на 0, щоб вимкнути їх, він моментально підскочив до 160 мс. Запуск обох з них призвів до 120 мс:

php artisan route:cache
php artisan config:cache

Недоліком є ​​те, що якщо я внімую зміни конфігурації або маршруту, мені потрібно буде їх кешувати, що дратує.

Як сторона, як не дивно, переміщення сайту з мого твердотільного накопичувача на обертовий жорсткий диск не забезпечило жодних переваг продуктивності, що для мене надзвичайно дивно, але я думаю, що це, можливо, кешовано, я перебуваю в Windows 10 з XAMPP.


-10

Laravel працює повільно, оскільки в більшості випадків використання PHP для веб-сторінок відбувається повільно.

За допомогою Laravel весь фреймворк перебудовується при кожному виклику - саме тому всі сторінки вказують на index.php. Оскільки весь фреймворк - це PHP-скрипти, кожен раз їм потрібно пройти через інтерпретатор PHP. Чим більший фреймворк, тим довше це триває.

Порівняйте це із "серверним середовищем" (наприклад, tomcat), де сервер запускає код ініціалізації один раз, і врешті-решт усі сторінки будуть у власному коді (після JIT).

Як довідковий приклад, використовуючи одне і те ж обладнання, ОС тощо, простий «привіт світ» із використанням JSP на цьому обладнанні дорівнює 3000 об / с, той самий привіт світ на laravel - 51 об / с.

Найпростіший спосіб перевірити накладні витрати на фреймворк і отриманий в результаті максимальний RPS на ядро ​​- це використовувати Apache AB і значення паралельності 1, з простим динамічним «привіт світом» (щоб уникнути статичного кешування сторінок).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.