Spec-Zone.ru › Composer

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

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

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

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

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

Оптимизация уровня 1: Генерация карты классов

Как это запустить?

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

  • Установите "optimize-autoloader": true в ключе config файла composer.json
  • Вызовите install или update с -o / --optimize-autoloader
  • Вызовите dump-autoload с -o / --optimize

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

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

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

Компромиссы

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

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

Оптимизация уровня 2/А: Авторитетные карты классов

Как это запустить?

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

  • Установите "classmap-authoritative": true в ключе config файла composer.json
  • Вызовите install или update с -a / --classmap-authoritative
  • Вызовите dump-autoload с -a / --classmap-authoritative

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

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

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

Компромиссы

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

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

Оптимизация уровня 2/В: кэш APCu

Как это запустить?

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

  • Установите "apcu-autoloader": true в ключе config файла composer.json
  • Вызовите install или update с --apcu-autoloader
  • Вызовите dump-autoload с --apcu

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

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

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

Компромиссы

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

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

© Nils Adermann, Jordi Boggiano
Licensed under the MIT License.
https://getcomposer.org/doc/articles/autoloader-optimization.md

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API