Symfony2 + Composer (несколько доменов)

В настоящее время мы переносим наш проект на symfony2. Сайт использует несколько доменов:

  • domain.com - основной сайт
  • help.domain.com - часто задаваемые вопросы
  • profile.domain.com - для пользовательского CP

и так далее

Чтобы заставить его работать, моя идея состоит в том, чтобы создать каталог «сайты» и для каждого субдомена создать свой собственный каталог, в котором есть файлы фреймворка + каталог поставщика с символическими ссылками на каталоги в корневом каталоге поставщика/* (каждый каталог, кроме композитора и файла autoload.php). Итак, структура выглядит примерно так:

root/
    sites/
        domain.com/
            app/
            src/
            web/
            vendor/
                symlinks for each library to root vendor
            composer.json
            composer.lock
        profile.domain.com/
            app/
            src/
            web/
            vendor/
                symlinks for each library to root vendor
            composer.json
            composer.lock
    vendor/

Мне нужно было сделать это так, потому что автозагрузка должна быть немного разной для каждого домена (мы храним код, который является общим для доменов в поставщике/компании, а код, уникальный для каждого домена, хранится в папке /src каталога домена) .

Проблема в том, что теперь я должен делать «composer install» в каждом каталоге, и он создает свой собственный composer.lock, и если я позже обновлю любой из каталогов, библиотеки будут обновлены, но файлы composer.lock не будут синхронизированы, так что это будет просто переустанавливайте его каждый раз.

Есть ли лучший способ решить эту проблему? (Я думал поставить composer только в корневую директорию, но не нашел способа выгружать разные файлы autoload.php для каждого домена).


person Anton    schedule 30.08.2012    source источник


Ответы (1)


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

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

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

Вы можете сбросить файл карты классов с помощью этой команды:

$ composer dump-autoload --optimize

Теперь вы должны получить повышенную производительность автозагрузки.

TLDR: используйте один composer.json с автозагрузкой карты классов, это быстро.

person igorw    schedule 30.08.2012
comment
Звучит разумно, спасибо. P.S. Мое решение действительно казалось довольно странным. - person Anton; 31.08.2012
comment
Он создаст файл в vendor/composer/autoload_classmap.php. Просто включите его вместо vendor/autoload.php. Разве мы не должны по-прежнему требовать vendor/autoload.php? - person Halil Özgür; 22.02.2013
comment
@HalilÖzgür Вы правы. Не уверен, что я сделал ошибку или это изменилось в композиторе с тех пор. Я обновлю ответ. - person igorw; 22.02.2013