Laravel действительно такой медленный?

51

Я только начал использовать Laravel. Я пока еще ничего не написал, но мои страницы занимают почти секунду, чтобы загрузить!

Изображение 247

Это немного шокирует меня, когда мои приложения без рамок и приложения NodeJS занимают ~ 2 мс. Что делает Ларавель? Это не нормальное поведение? Нужна ли какая-то тонкая настройка?

  • 6
    Попробуйте запустить php artisan optimize --force
  • 0
    @JosephSilber Спасибо. Это могло бы немного помочь. Сейчас оно колеблется между ~ 110 мс и ~ 580 мс, ничего промежуточного. Не уверен, что вызывает противоречивое поведение. Несмотря на это, даже 110 является высоким ИМО.
Показать ещё 11 комментариев
Теги:
performance

8 ответов

76
Лучший ответ

Laravel не на самом деле медленный. 500-1000 мс абсурд; Я отключил его до 20 мс в режиме отладки.

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

kreeves указал мне в правильном направлении, это сообщение в блоге описывает новую функцию в Vagrant 1.5, которая позволяет вам rsync ваши файлы в виртуальную машину, а не использовать общую папку.

В Windows нет встроенного клиента rsync, поэтому вам нужно будет использовать cygwin. Установите его и не забудьте проверить Net/rsync. Добавьте C:\cygwin64\bin к вашим путям.

Vagrant представляет новую функцию. Я использую Puphet, поэтому мой Vagrantfile выглядит немного смешно. Я должен был настроить его таким образом:

  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 создает много временных файлов, которые могут отключать наблюдатели файлов, но если вы позволите ему обрабатывать загружаемые файлы, это будет хорошо.

  • 0
    Что вы сделали, чтобы улучшить свою производительность (кроме использования rsync)?
  • 2
    @jpcamara Ничего. Один только Rsync уменьшил его до ~ 20 мс. Вы можете запустить его под HHVM, отключить любую отладку и запустить artisan optimize для небольшого повышения. Остальное, в основном, как вы разрабатываете свое приложение, я думаю. Установите barryvdh/laravel-debugbar и ищите любую медлительность.
Показать ещё 7 комментариев
18

Чтобы помочь вам с вашей проблемой, я нашел этот блог, в котором говорится о том, чтобы оптимизировать производство laravel. Большая часть того, что вам нужно сделать, чтобы быстро сделать ваше приложение, теперь будет в руках, насколько эффективен ваш код, ваша емкость сети, CDN, кеширование, база данных.

Теперь я расскажу о проблеме:

Ларавел медленный из коробки. Есть способы его оптимизации. У вас также есть возможность использовать кеширование в вашем коде, улучшая свою серверную машину, yadda yadda yadda. Но в конце концов Laravel все еще медленный.

Laravel использует множество библиотек symfony, и, как вы можете видеть в techempower benchmarks, symfony занимает очень низкое (последнее, если не сказать больше). Вы даже можете найти laravel benchmark, чтобы быть почти внизу.

В фоновом режиме происходит много автозагрузки, которые могут даже не загружаться. Так технически, поскольку laravel прост в использовании, он помогает вам быстро создавать приложения, а также замедляет работу.

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

Обычный компромисс:

 Easy = Slow, Hard = Fast

Я бы подумал, что C или Java имеют сложную кривую обучения и жесткую ремонтопригодность, но она занимает очень высокое место в веб-инфраструктурах.

Хотя это не слишком связано. Я просто пытаюсь доказать точку easy = slow:

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

Изображение 3570

  • 64
    какое отношение эта графика имеет к вопросу?
  • 0
    @ NullPoiиteя просто доказывал свою точку зрения (как указано).
Показать ещё 2 комментария
11

Я обнаружил, что наибольшее увеличение скорости с 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
    Очевидно, и я бы рекомендовал никому никогда не использовать файл в качестве сеанса. Подумайте о масштабируемости :)
  • 5
    @ разработчик что? В этом примере файл более чем в 4 раза быстрее, чем база данных
Показать ещё 6 комментариев
7

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

Сделать http-response "Hello World":

  • Golang с обработчиком журналов stdout: 6000 rps
  • SpringBoot с обработчиком журнала stdout: 3600 rps
  • Laravel 5 с выключенным протоколом: 230 об/мин
  • 0
    Не знаю, почему это было отмечено как собственное, да, может быть, более уместно в качестве комментария. Хотя я также испытываю ОЧЕНЬ медленное время отклика в док-контейнере ~ 600 мс
  • 0
    вы пробовали кеширование маршрутов?
Показать ещё 3 комментария
4

Да - Laravel действительно очень медленный. Для этого я создал приложение POC. Простой маршрутизатор с формой входа. Я мог получить только 60 RPS с 10 параллельными соединениями на цифровом океаническом сервере стоимостью 20 долларов США (несколько GB RAM);

Настройка:

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

Я запускал оптимизацию, компоновщик dump autoload и т.д., и фактически уменьшал RPS до 43-иш.

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

Сравнительно, я протестировал свое приложение PHP Native для создания нескольких миллионов запросов в день на AWS t2.medium(x3, балансировка нагрузки). Когда я AB'd 25 параллельных подключений от моей локальной машины к этой сети, через ELB, я получил приблизительно 1200 RPS. Огромная разница на машине с нагрузкой по сравнению с страницей "входа" в laravel.

Это страницы с сеансами (эластичная/memcached), поисковые запросы в реальном времени (кэшированные запросы через memcached), активы, извлеченные из CDN и т.д. и т.д. и т.д.

То, что я могу сказать, laravel палочки около 200-300ms нагрузки на вещи. Это прекрасно для PHP. Созданные представления, в конце концов, этот тип задержки допустим при загрузке. Однако для представлений PHP, которые используют Ajax/JS для обработки небольших обновлений, он начинает чувствовать себя вялым.

Я не могу представить, как эта система будет выглядеть с помощью приложения с несколькими арендаторами, в то время как 200 ботов сканируют по 100 страниц каждый в одно и то же время.

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

Однако мне никогда не хотелось начинать с чего-то, что может связывать и вызывать нагрузку 300 мс для сообщения "привет мир".

Если вы думаете: "Кого волнует?"

.. Напишите прогностический поиск, который опирается на быстрые запросы, чтобы отвечать на предложения автозаполнения на несколько сотен тысяч результатов. Это отставание в 200-300 м приведет вас к безумию.

  • 2
    Почему чепуха промежуточного программного обеспечения? Не хочешь объяснить фактами, чтобы все мы могли утверждать, что это чепуха? Кроме того, я запускаю установку Laravel, которая успешно отвечает от 80 до 65 мс (да, она выполняет запрос БД для 4-миллиардной таблицы записей), поэтому мне интересно узнать, о чем вы.
  • 2
    Вы, очевидно, любите Laravel. Я установил базовую установку, оптимизировал и получил плохие результаты. Я обнаружил, что для обработки перед маршрутом требуется промежуточное программное обеспечение и обратный инжиниринг; который не был идеальным. Просто потому, что вы получили «ВАШУ» установку Laravel для оптимизации, отлично. Это не имеет значения. Маршрутизация базового пакета HELLO WORLD была намного тяжелее и медленнее, чем простая структура маршрутизации и шаблонизатор веток. Можно ли оба кэшировать? Оптимизированный? Улучшенный? Да. В этом ли смысл? Нет, Ларавел тяжелый. Тяжелый - медленный (э). Мир согласен с этим. используйте его, если вам это нравится, но это не богословие. :)
Показать ещё 7 комментариев
3

Я использую Laravel совсем немного, и я просто не верю числам, которые он мне говорит, потому что сквозной рендеринг, измеренный моим браузером, показывает LOWER общее время от запроса до готовности.

Кроме того, я получаю несколько более высокие числа на моей машине на работе, что делает страницу заметно быстрее, чем моя машина дома.

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

Laravel на самом деле не настолько медленный, особенно когда он оптимизирован. Тем не менее, он голоден в памяти. Даже тяжелая CMS, такая как Drupal, которая очень медленная, кажется, имеет около 1/3 объема памяти запроса голосовой кости Laravel.

Таким образом, чтобы запустить Laravel в производстве, я бы развернул серверы с оптимизацией памяти до серверов, оптимизированных для CPU.

  • 0
    Я не уверен, что эти цифры на месте, но это определенно заметно. Что вы подразумеваете под «особенно при оптимизации»? Как вы оптимизируете это? Просто запустив php artisan optimize или мы можем сделать больше?
  • 0
    Несколько вещей, которые вы можете сделать, описаны в этих двух ссылках: crynobone.com/posts/7/crunching-laravel-4-for-production-server | lutro.priv.no/posts/optimizing-for-production-with-laravel-4
2

Я знаю, что это немного старый вопрос, но все изменилось. Ларавел не так уж медленный. Это, как уже упоминалось, синхронизированные папки медленны. Однако в Windows 10 я не смог использовать rsync. Я попробовал как cygwin, так и minGW. Похоже, что rsync несовместим с git for windows версией ssh.

Вот что сработало для меня: NFS.

Vagrant docs говорит:

Папки NFS не работают на хостах Windows. Vagrant проигнорирует ваш запрос на синхронизированные папки NFS в Windows.

Это больше не так. В настоящее время мы можем использовать vagrant-winnfsd плагин. Это действительно просто установить:

  • Выполнить vagrant plugin install vagrant-winnfsd
  • Измените свой Vagrantfile: config.vm.synced_folder ".", "/vagrant", type: "nfs"
  • Добавить в Vagrantfile: config.vm.network "private_network", type: "dhcp"

Это все, что мне нужно для работы NFS. Время ответа Laravel уменьшилось с 500 мс до 100 мс для меня.

  • 0
    Вы пробовали rsync через Bash для Windows? Я запускаю его прямо сейчас, и он отлично работает.
  • 0
    Нет, я не пробовал. Я знаю, многие пишут, что rsync прекрасно работает и с git bash, и с windows cmd. Я не знаю, почему это не работает для меня. Но я все равно нашел другое решение. Может быть, это было бы полезно для кого-то.
0

Следующий снимок экрана представляет собой пример без любых реализованных методов производительности.

По умолчанию скорость загрузки нескольких моделей, http-фильтров и контейнеров.

Изображение 3571

Не намного медленнее, вам нужно правильно настроить свой Laravel. В Laravel существует множество методов оптимизации. Попробуйте некоторые.

Я использовал все популярные PHP Framework для разработки веб-приложений, и мои исследования показывают, что Laravel - лучшая структура для PHP с точки зрения

  • Скорость/Производительность
  • ремонтопригодность
  • Производительность разработчика
  • Удобство
  • Локализация
  • Безопасность
  • Юзабилити
  • Масштабируемость
  • Тестируемость
  • готовность к развертыванию

Ещё вопросы

Сообщество Overcoder
Наверх
Меню