Блог веб-разработчика v 1.0.0
Symfony2, AngularJS, React, Gulp, PhpStorm и много других страшных слов

Ускоряем Symfony2 на Vagrant

9 лет назад
9576 просмотров
Symfony2 Vagrant

В прошлый раз мы уже разворачивали Symfony2 окружение на Vagrant. Пустая страница на голой Symfony2 запущенной на Vagrant генерируется около 3-4 минут на стандартном десктопном железе. Это первая проблема с которой сталкивается программист, решивший разрабатывать на модном нынче Vagrant. Что-то разрабатывать в таком темпе становится невозможно.

Проблема в очень медленной файловой системе бесплатного VirtualBox и до кучи медленного стандартного механизма синхронизации файлов Vagrant.

Можно все исправить прикупив VMware. Их ФС работает в разы быстрее и, как говорят, Symfony2 будет летать на Vagrant. Однако я не проверял, т.к. лишних денег на покупку VMware у меня нет, да и вообще мы не ищем легких путей.

Второй способ - это изменение механизма синхронизации файлов. Разберемся, что же нам предлагает Vagrant:

  • RSync - довольно известный инструмент. Symfony2 на нем шикарно работает, rsync прост в настройке (даже на Windows), но есть один жирный минус. RSync поддерживает синхронизацию только в одном направлении (host - guest или наоброт). В обе стороны - ни-ни. Можно поставить плагины вроде rsync-back, но, честно говоря, это тот еще бред. Жутко неудобно и постоянно боишься потерять свои файлы.
  • NFS - Network File System тоже сносно работает, но на Windows хосте не получится ее использовать. Можно поставить vagrant-winnfs плагин, но открытый мной баг висит уже месяц и не думает исправлятся, а с этим багом работать становится невозможно. А жаль, работает NFS довольно быстро.
  • SMB - Server Message Block. Работает чуть медленнее NFS, зато хоть работает. Не требует дополнительных плагинов и прост в настройке. Работает только на Windows, что меня полностью устраивает (гостевая машина может быть и Linux). Из неудобств: вам либо придется каждый раз при vagrant up вводить свой логин-пароль от Windows-пользователя, либо светить их в настройках (Vagrantfile). Я выбрал второе и не жалуюсь.

Надеюсь вы сможете сами настроить SMB, для этого нужно добавить целых пять символов, включая кавычки.

Запускаем и....долго. Жутко долго грузится Symfony2. Быстрее стандартного механизма, но ждать минуту для инициализации страницы не вариант. Проблема в большом количестве генерируемых файлов кеша Symfony2, которые находятся в синхронизируемой директории. Исключить что-то из синхронизации нельзя, так уж устроен механизм SMB. Поэтому подойдем к вопросу с другой стороны: перенесем кеш Symfony2 (а заодно и логи, чтоб еще легче было) за папку /vagrant.

Открываем наш AppKernel.php и добавляем пару методов (тестовое окружение нужно вынести, чтобы тесты у вас отрабатывали не часами, а за адекватные сроки):

public function getCacheDir()
    {
        if ($this->environment == 'dev' || $this->environment == 'test') {
            return '/tmp/symfony2/cache/' . $this->environment;
        } else {
            return parent::getCacheDir();
        }
    }

    public function getLogDir()
    {
        if ($this->environment == 'dev' || $this->environment == 'test') {
            return '/tmp/symfony2/logs/' . $this->environment;
        } else {
            return parent::getLogDir();
        }
    }

Таким образом для dev и test окружения мы перенесли папки кеша и логов в /tmp. Проверяем - страница генерируется примерно за 2-3 секунды. Я считаю это отличным результатом, пусть и дольше реального сервера.

Так же у SMB есть еще один минус: невозможность создать символьные ссылки внутри синхронизируемой директории (например, ассеты). Это доставляет некоторые неудобства, которые я пока не обошел. Советы из интернетов мне лично не помогли.

По поводу раздела Limitations в документации: я так и не понял где должна появиться проблема, поэтому не волнуйтесь на этот счет.

Что еще почитать
Авторизация в тестах PHPUnit в Symfony2
10 лет назад
8435 просмотров
Рано или поздно вам понадобится иммитировать авторизованного пользователя в PHPUnit тестах. Советы из документации полезны, но не совсем удобны.