Один автозагрузчик composer (autoload.php) в index файле или несколько разбросанных по проекту?
Приветствую коллеги, недавно начал работать с композером, но нигде в мануалах не затрагивается данный вопрос. Если я правильно понял, то автолоадер по сути просто инклудит все файлы с учетом зависимостей в нужном порядке. Предположим, что у нас несколько десятков библиотек.
Подключаем autoloader.php в индексном файле.
+ забываем об инклудах новых библитек навсегда
- видимо при каждом простом запросе, где вообще не нужны эти библиотеки получаем чрезмерную нагрузку на интерпретатор, в связи подключением мегабайт кода (считайте, если у нас либы весят 1МБ, то каждый запрос на время обработки отжирает 1МБ памяти, довольно ощутимо)
Создаем несколько composer.json разбросанных по проекту и подключаем зависимости в зависимости от функционала конкретного модуля
+ в коде подключено только то, что нужно на момент использования этой части скрипта
- вероятно появляется геморрой с продумыванием архитектуры и в этом плане. Будет дублирование зависимостей, возможно будет дублирование при подключении через 'use {namespace}'
Собственно, есть ли какие-то best practices по этому поводу?
Как бы там 4 метода автозагрузки. Описаный вами это files так работает, Берет и все инклюдит что вы ему там прописали.
В других способах автолоад сработает только тогда когда это потребуется. Пройдитесь по скрипту дебагом сразу поймёте.
Ну, там вроде инклуд и идёт или я не понял, каким это хитрым образом происходит, собственно поэтому и возник изначальный вопрос.
А откуда вы узнали про 4 метода автозагрузки?
В официальных доках ничего про это не нашел и при гуглении тоже нет упоминаний.
Я вообще использую стандартный метод. Просто в index.php подключаю в начале autoload.php как бы это в доках и указано.
Александр Сисюкин: Ооо, спасибо. Видимо вы об этом говорили https://getcomposer.org/doc/04-schema.md#autoload ?
Теперь я совсем запутался. В моем случае вообще нет секции autoload, а только require. По идее require отвечает за то какие зависимости нужно подгрузить. Я правильно понял, что и require и autoload по сути отвечают за генерацию файла со всеми путями к библиотекам, а конечная реализация в итоге всё равно одинаковая? (за исключением прямого подключения файлов)
Нет не одинаковая в вашем случае Грузии все разом а в автолоад классы будут грузится по мери их надобности. Как только интерпретатор наткнется на неизвестное имя класса он начнёт его искать в класс мапе композера. Или же если у вас psr он будет грузить то что вы указали в use также по мере необходимости.
Александр Сисюкин: то что require отвечает за то, что нужно подгрузить это ясно, но не понял как в итоге отрабатывает функционал автозагрузки, если секция autoload не указана? shagguboy говорит, что "автолоад это include по запросу", это как раз то что нужно, но как это осуществляется в контексте отсутствия секции autoload? Различаются ли как то по скорости работы варианты автозагрузки или их выбор определяется лишь соответствием библиотек стандарту оформления в пакет?
shagguboy: Без претензий, но или вы не правы или я совсем запутался. У меня composer.json выглядит так
{
"require": {
"wisembly/elephant.io": "~3.0",
"cboden/ratchet": "^0.3.6"
}
}
Далее я в index.php подключаю библиотеки через require '/vendor/autoload.php';
Собственно, о какой ошибке идёт речь? Секция не подключена, но всё работает. Правд там где нужно использовать класс, нужно осуществить
use Ratchet\MessageComponentInterface; (например). Вы об этом говорите?
shagguboy: при исполнении composer.json создается папка vendor в которой создается autoload.php + все либы которые указаны в json. Этот автозагрузчик я и подключаю в индексном файле. В composer.json только указана секция require, как в примере на 2 коммента выше. Секция автолоад, в которой указывается psr или прочие варианты у меня в json файле нет. Вы же пишете, что "никак. выкинет ошибку "Неизвестный класс"", если её нет. Или не об этом речь? Нафига она тогда нужна, если и без неё работает или чего?
shagguboy:
1) Т.е., то что изначально оформлено по стандартам, будет автоматом срабатывать и без добавления секции?
2) Тогда я возвращаюсь к вашему ответу "никак. выкинет ошибку "Неизвестный класс"". Выкенет ошибку, если я в каком то из файлов напрямую не укажу через "use" подключение класса? Об этом речь?
3) Можете подсказать как узнать подробней про class map? Из того что могу найти нет описание этого, будто это что то такое само собой разумеющееся. mapping то же самое.
Роман:
1) да. ели не оформлено по стандартам то есть 2 выхода. зарегистировать свою функцию автолоада или сделать классмап композером.
2) если не сделать свой кастомный автолоад или не оформить автолоад понятным компрозеру способом, то класс не загрузится, и php выкинет исключение
- видимо при каждом простом запросе, где вообще не нужны эти библиотеки получаем чрезмерную нагрузку на интерпретатор, в связи подключением мегабайт кода (считайте, если у нас либы весят 1МБ, то каждый запрос на время обработки отжирает 1МБ памяти, довольно ощутимо)
автолоад так не работает. он грузит класс только когда к нему идет обращение.
К нему в смысле к классу? Т.е. если у меня на 50 гб там библиотек, а я не использую никакую из них, то и накладных расходов практически никаких не будет?
shagguboy: там довольного много, а сейчас нет времени на углубленное изучение, по сути сейчас стоит вопрос так "экономия на спичках или реально важно". Про OPCache понял, важно замечание, про это не подумал. Всё же, для однозначности спрошу. Кроме как на ОПКэш нагрузки особо не будет, т.к. при каждом запросе не все либы грузятся в память, а только то что нужно при данном запросе и можно смело подключать это в индексном файле ?