/ php

Почему при разработке на 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)
control_panel
enable_disable
Где отключите Hyper-V компонент
-----_-

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


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

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

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

hyper_v_cmd

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

Аналогичную команду можете сделать и для включения:
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:
vagrant_build_reslt vagrant_cache_reslt

Docker

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

OpenServer | WinNMP

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

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

Резюме

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