Оптимизация скорости работы автозагрузчика Composer
Composer. Оптимизация скорости автозагрузки


Оптимизация автоматического загрузчика Composer.

По умолчанию автозагрузка Composer работает относительно быстро. Однако, из-за того, как настроены правила автозагрузки PSR-4 и PSR-0, ему необходимо проверить файловую систему, прежде чем окончательно установить имя класса. Это значительно замедляет работу, но это удобно при разработке, так как когда вы добавляете новый класс, он может быть немедленно обнаружен/использован без необходимости перестраивать конфигурацию автозагрузки.

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

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

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

Уровень оптимизации 1: Создание карты классов.

Как её сделать?

Есть несколько вариантов, как это включить:

  • Установите "optimize-autoloader": true внутри ключа конфигурации composer.json.
  • Выполните install или update с параметром -o / --optimize-autoloader.
  • Выполните команду dump-autoload с параметром -o / --optimize.

Что она делает?

Создание карты классов по сути преобразует правила PSR-4/PSR-0 в правила classmap. Это значительно ускоряет работу, так как для известных классов карта классов мгновенно возвращает путь, и Composer может гарантировать, что класс находится там, поэтому нет необходимости проверять файловую систему.

На PHP 5.6+ карта классов также кэшируется в opcache, что значительно увеличивает время её инициализации. Если удостовериться, что opcache включен, то карта классов будет загружаться почти мгновенно, и тогда загрузка классов будет быстрой.

Альтернативные варианты.

В этом методе нет никаких реальных компромиссов. Он всегда должен быть включен в production.

Единственная проблема заключается в том, что он не отслеживает ошибки автозагрузки (т.е. когда он не может найти заданный класс), поэтому они возвращаются к правилам PSR-4 и могут привести к медленным проверкам файловой системы. Для решения этой проблемы существуют две опции оптимизации уровня 2, и вы можете включить одну из них, если у вас много проверок class_exists, которые выполняются для классов, не существующих в вашем проекте.

Уровень оптимизации 2/A: Авторитарные карты классов.

Как их использовать?

Есть несколько вариантов, как это включить:

  • Установите "classmap-authoritative": true внутри ключа конфигурации composer.json.
  • Выполните команду install или update с параметром -a / --classmap-authoritative.
  • Выполните команду dump-autoload с параметром -a / --classmap-authoritative.

Что это дает?

Включение этой опции автоматически включает оптимизацию карты классов первого уровня.

Эта опция указывает, что если что-то не найдено в карте классов, то этого не существует, и автозагрузчик не должен пытаться искать в файловой системе в соответствии с правилами PSR-4.

Альтернативные варианты.

Эта опция заставляет автозагрузчик Composer всегда очень быстро загружать классы. С другой стороны, это также означает, что если класс по какой-то причине будет сгенерирован во время выполнения, он не попадет в автозагрузку. Если ваш проект или любая из ваших зависимостей делает это, вы можете столкнуться с проблемой "класс не найден" ("class not found") в production. Используйте это с осторожностью.

Примечание: Эту настройку нельзя комбинировать с оптимизациями уровня 2/B. Вы должны выбрать одну из них, поскольку они решают одну и ту же проблему разными способами.

Уровень оптимизации 2/B: Кэш APCu.

Как с ним работать?

Есть несколько вариантов, как это включить:

  • Установите "apcu-autoloader": true внутри конфигурационного ключа composer.json.
  • Выполните команду install или update с параметром --apcu-autoloader.
  • Выполните команду dump-autoload с параметром --apcu.

Что он делает?

Эта опция добавляет кэш APCu в качестве запасного варианта для карты классов в Composer. Однако он не будет автоматически генерировать карту классов, поэтому вам все равно следует включить оптимизацию первого уровня вручную, если это необходимо.

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

Альтернативные варианты.

Этот вариант требует APCu, который может быть вам доступен или недоступен. Он также использует память APCu для целей автозагрузки, но он безопасен в использовании и не может привести к тому, что классы не будут найдены, как оптимизация авторитарной карты классов выше.

Примечание: Эту оптимизацию нельзя комбинировать с оптимизацией уровня 2/A. Вы должны выбрать одну из них, поскольку они решают одну и ту же проблему разными способами.

Перевод с английского официальной документации Composer:
https://getcomposer.org/doc/articles/autoloader-optimization.md

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню