Почему при разработке на Symfony я предпочитаю использовать Vagrant?

Если при разработке приложений на Symfony под ОС Windows использовать Docker, то со 100-процентной вероятностью вы заметите, что рендеринг страниц происходит чрезвычайно медленно.
При каких-либо изменениях в коде проекта, происходит перестроение кеша, и общее время рендеринга страницы может быть равно 3-4 секундам, иногда 10, иногда больше (иногда настолько долго, что nginx обрубает подключение по таймауту).
При частых изменениях и попытках быстрой разработки понимаешь, что много времени просто тратится на ожидание перестроения кеша и прочей внутренней кухни Symfony. При этом, процесс разработки становится не самым приятным и удобным. С этим нужно что-то делать, подумал я, и задался вопросом, как ускорить работу symfony на windows.

Почему Symfony работает так медленно на Docker?

Эта проблема происходит из-за того, под ОС Windows и MacOS медленно работают Docker Volumes. Потому такое большое время занимается только из-за работы файловой системы внутри ОС. В противовес этому, ОС Linux лишена такого изъяна, и работает на порядок быстрее.

Это грустно, но это правда - MacOs/Windows машины имеют низкий показатель скорости при работе в Docker. Для того, чтобы увеличить продуктивность работы Docker на Mac/Windows, можно попробовать использовать Docker Volumes для директорий кеша. Это позволяет не создавать лишний слой данных в файловой системе, и размещать кеш непосредственно в виртуальной машине. Это немного приближает нас к повышению производительности, однако, этого совсем недостаточно. Вы, при этом, лишаетесь возможности доступа к свежей версии кеша из вашей основной ОС, но, оно и не особо то нужно.

В добавок, вы можете смонтировать папку vendor как Docker Volume тоже. Это даёт дополнительное повышение производительности, благодаря чему, composer запускается со скоростью чтения данных с жесткого диска, без дополнительных затрат на чтение. Но, обратной стороной этого решения является то, что теперь вы не сможете просмотреть папку vendor из вашей основной ОС, и PHPStorm (если используете) не сможет проанализировать библиотеки, и часть его функционала по автодополнению будет вам недоступна.

Ещё на просторах интернета бытует мнение, что использование ПО Docker-sync решает проблему со скоростью. Возможно оно работает хорошо, но это дополнительный костыль, которым накладывает определённые неудобства в использовании. Потому, хотелось всё пофиксить теми ресурсами, с которыми знаком, и знаниями в чём уже обладаю, без дополнительного изучения чего-то нового.

Пример настраиваемого docker-compose конфига на проброс Volumes, можете посмотреть по ссылке.

Ещё по интернетам ходит легенда о людях, которые, закрыв глаза на полную извращённость этого способа: используют Docker внутри Vagrant-а. Этот способ работает, но я не использую его из философских соображений (только не спрашивайте меня, откуда я знаю, что этот способ работает).

Как решить?

Для решения этой проблемы существует несколько способов:

  • Установка OpenServer/XAMP для Windows/MacOS.
  • Работать с Vagrant-ом.
  • Использовать Docker, проведя некоторые меры по ускорению, как было описано выше.
  • Последний способ. Смириться, использовать как есть. Использовать и плакать ^^.

Проблемы

Если у вас уже установлен Docker, и вы установите Vagrant, то, можете получить ошибку:
VBoxManage.exe: error: WHvCapabilityCodeHypervisorPresent is FALSE

Эта ошибка значит, что система виртуализации не работает вместе с включённым компонентом Hyper-V.

Потому его нужно отключить, для этого, зайдите в Панель управления > Программы и компоненты > Включение/отключение компонентов > Отключите систему виртуализациии (Hyper-v hyper vision)


Где отключите Hyper-V компонент

При отключении/включении компонентов будет произведена перезагрузка системы.


Если вам часто придётся переключить эти параметры, то может быстро надоесть постоянно заходить в панель управления, переключая этот компонент. Потому, вам важно знать, как включить/отключить Hyper-V из командной строки всего одной командой.
Для упрощения переключения в один клик, можете создать bat-скрипт, который будет делать всю работу за вас.

Для этого, создайте новый текстовый документ (скажем, на рабочем столе), назвав HYPER-V OOF cmd, и добавив в него команду для отключения Hyper-v из CMD:

dism.exe /Online /Disable-Feature:Microsoft-Hyper-V-All

После чего, сохраните, измените расширение с txt на bat, и запустите от имени администратора.

Аналогичную команду можете сделать и для включения:
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

К сожалению, одновременная их работа Docker и Vagrant невозможна, и приходится либо их постоянно переключать, либо выбирать меньшее зло, используя что-то одно, скрипя зубами и терпя их недостатки. Если вы планируете использовать их вместе, то придётся постоянно переключать компонент Hyper-V.

Скажу честно, я, вначале, когда установил Vagrant, не поверил, что это реальная его скорость работы. Потому что, привыкнув к тому перфомэнсу, что демонстрировал Docker, или OpenServer, разница была колоссальная.

Vagrant

Если у вас перестал запускаться Vagrant после установки Docker-а, то удалите свою старую версию Vagrant и VirtualBox, и установите их последние версии, скачанные с офф.сайтов.

Нужно ли вам использовать способ с "лавированием между" Докером и Вагрантом, зависит от того, как часто вы разрабатываете на Symfony. Но для себя я решил, что даже постоянно тратя время на смену окружения Docker -> Varant, и наоборот, на дистанции я экономлю время и нервы которое выиграю от большей скорости работы Symfony на Windows.

Для сравнения, первый запуск Symfony на Vagrant:

Docker

Как можете видеть, такое время тратится при каждом запросе, даже, учитывая закешированные результаты.
(этот тест немного необъективен, здесь открыта 404 страница, выполнена "дорогая" операция исключения, но не суть...)

OpenServer | WinNMP

Так же, я для очистки совести сделал тесты на OpenServer, получив, опять-таки, необъективный результат:

А так же, хвалёный WinNMP:

Резюме

В этой статье я субъективно и поверхностно протестировал несколько вариантов запуска проекта Symfony. Этот тест проводился на одном и том же проекте, в разных системах, которые использовались "как есть", без чрезмерных и глубоких настроек. Потому, статья написана только на основании этих показателей. На своём личном опыте я уже протестировал каждый из этих способов, и решил, что лучший для меня - использовать Vagrant.

Многие люди, в том числе и я, вначале, задавался вопросом, почему symfony проект на Docker работает так медленно, и как его ускорить. Ответ есть - ускорить можно: вынести некоторые из папок в Volumes, в системе включить индексирование папки с проектом, отключить антивирус и прочие мелочи, которые, на самом деле, пользователям Windows не приносят желаемой и комфортной производительности. Потому, единственный ответ на то, как ускорить работу Symfony проекта на Docker - не использовать Docker, а использовать Vagrant. Или же, использовать Docker, but cry is free.

В этой статье я описал все возможные способы ускорения Symfony на Windows 10, Docker. А так же, описал небольшой туториал по настройке Docker-а, для более быстрой работы, и описал возможные альтернативы. Надеюсь, сегодня вы смогли решить проблему с тем, что Symfony слишком медленный благодаря этой статье.

Так же, небольшим сегодняшним бонусом было показано, как управлять компонентом Hyper-V, отключая/включая его из командной строки CMD.

Превью этой статьи чётко описывает суть этой статьи: либо используйте то, что любите (Docker), но страдайте, либо то, что более рационально, но страдайте из-за нехватики более любимого инструмента. Но, я показал, как ими можно дирижировать, почти лишившись страданий ^^.