Оптимизация автозагрузки (Autoloader Optimization)

  1. Уровень оптимизации 1: создание карты классов
    1. Как запустить его?
    2. Что оно делает?
    3. Компромиссы
  2. Уровень оптимизации 2/A: Авторитетные карты классов
    1. Как запустить его?
    2. Что оно делает?
    3. Компромиссы
  3. Уровень оптимизации 2/B: кэш APCu
    1. Как запустить его?
    2. Что оно делает?
    3. Компромиссы

По умолчанию автозагрузчик 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 в правила класса. Это делает все немного быстрее, так как для известных классов карта класса мгновенно возвращает путь, и Composer может гарантировать, что класс находится там, поэтому нет необходимости в проверке файловой системы.

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

Компромиссы #

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

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

Уровень оптимизации 2/A: Authoritative class maps #

Как запустить его? #

Для этого есть несколько вариантов:

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

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

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

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

Компромиссы #

Эта опция заставляет автозагрузчик всегда возвращаться очень быстро. На обратной стороне это также означает, что в случае, если класс сгенерирован во время выполнения по какой-то причине, ему не будет разрешено автозагружаться. Если ваш проект или какая-либо из ваших зависимостей делает это, вы можете столкнуться с проблемами «класса не найден» в процессе производства. Включите это с осторожностью.

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

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

Как запустить его? #

Для этого есть несколько вариантов:

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

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

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

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

Компромиссы #

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

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