Подтвердить что ты не робот

Зачем использовать автосоздание PSR-0 или PSR-4 в компоновщике, если classmap на самом деле быстрее?

Я понимаю, что вы можете использовать либо стандарт PSR для поиска файлов, либо сообщить композитору каталог для сканирования для классов. Документация рекомендует использовать стандарт PSR-4. Существует также возможность для композитора создать оптимизированный автозагрузчик, который в основном генерирует полную карту классов. Итак, зачем вообще использовать PSR-4, если лучший способ загрузки - с помощью classmap?

Мне разумно сохранять структуру каталогов, так как это хороший способ организовать в любом случае. Тем не менее, похоже, что логическим вариантом будет использование загрузки PSR-4 на машинах разработки, а затем classmap для рабочей среды. Таким образом, вам не нужно перестраивать вашу классовую карту каждый раз, когда вы создаете новый класс, но производственная среда создает полную часть в составе процесса развертывания без дополнительного вызова

./composer.phar dump-autoload -o
4b9b3361

Ответ 1

Зачем использовать автосоздание PSR-0 или PSR-4 в компоновщике, если classmap на самом деле быстрее?

Потому что это более практично.

В процессе производства вы можете использовать classmap (с composer dumpautoload -o), потому что вы не будете добавлять какой-либо новый класс, но в среде dev интересно иметь гибкость, предоставляемую PSR-0 или PSR-4 (т.е. при добавлении новых классов).

Обновление: вы также можете использовать composer install -o, это проще.

Ответ 2

Проблема заключается в том, что classmap НЕ выполняется быстрее в каждом случае!

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

Но недостатком classmap является то, что вы, возможно, генерируете огромное количество данных для каждого отдельного класса, интерфейса и признака, включенных в используемые вами библиотеки, без фактического использования его в вашем производственном коде. Загрузка огромных массивов не приходит бесплатно - в то время как код не нужно разбирать снова и снова (кеш-код операции), он все равно должен быть выполнен, структура данных массива должна быть помещена в память, заполнена множеством строк, а затем съедает некоторый объем памяти, который мог бы быть использован для чего-то еще.

Я нашел два ресурса, обсуждающих эту тему: Прежде всего, проблема github # 1529, предлагающая дальнейшие улучшения для автозагрузчика композитора, используя кучу symlinks, чтобы избежать сканирования нескольких каталогов.

В обсуждении также показано, что вы должны попытаться использовать наилучшее возможное префикс namespace- или classname в объявлении автозагрузки PSR-0, то есть самый длинный из возможных. Вы также можете использовать в объявлении более одного префикса.

Затем есть сообщение в блоге, связанное в этом выпуске, которое документирует некоторые тесты xhprof, используя запас EZPublish 5 и возиться с настройками, включая APC Кэширование и классовая демпинг.

Денежная цитата:

Эта команда создала файл версии 662KiB vendor/composer/autoload_classmap.php, содержащий массив, который представляет собой хэш, состоящий из имени класса в качестве индекса и пути к файлу, содержащему определение класса как значения. В то время, когда я пишу этот пост, этот массив состоит из 4168 записей. [...] Хотя он должен дать нам наиболее эффективный механизм автозагрузки, он фактически замедляет работу (с 254,53 до 2,995). Причина в том, что даже если файл кэшируется APC, массив PHP, содержащий карту с более чем 4100 записей, должен быть воссоздан при каждом отдельном запросе.

Будет ли классная карта быстрой? Безусловно. Самый быстрый в каждом случае? Конечно, нет - это зависит от отношения, используемого против неиспользуемых классов для каждого запроса. Так что даже если в среднем ваше приложение на самом деле использует ВСЕ классы на карте, classmap может все еще быть медленнее, если вы используете только около 10% классов для каждого запроса, и вам будет лучше оптимизировать объявления автозагрузки библиотек, которые вы используете, На самом деле, каждый префикс classname должен указывать только на один каталог.

Обратите внимание, что выигрыш в производительности, который вы достигнете, составляет всего около одной миллисекунды за один запрос. Ваша заявка, безусловно, потрясающая, если эта цифра является значительным повышением производительности в диапазоне от 5 до 10%. Но если вы действительно находитесь в этом диапазоне производительности, слепо полагая, что classmap ВСЕГДА быстрее, вероятно, тратит много ненужных циклов процессора.

Если вы что-то оптимизируете: измерьте это! Как вы узнаете, действительно ли это станет лучше, если вы не можете измерить его?

Ответ 3

вот что вам нужно сделать, если вы добавили/изменили классы:

  • classmap: композитор dumpautoload (возможно, также обновите композитор .json с новой записью).
  • psr-0: ничего
  • psr-4: ничего

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

файлы автозагрузчика:

  • classmap: поставщик/композитор/autoload_classmap.php
  • psr-0: поставщик/композитор/автозагрузка_namespaces.php
  • psr-4: поставщик/композитор/autoload_psr4.php

Ответ 4

Важным аргументом здесь является то, что использование psr-4 или psr-0 в composer.json заставляет вас организовывать ваши файлы классов по строгому стандарту. Это позволяет другим (или вам через 2 года) смотреть на композитора .json, чтобы сразу узнать, где находятся ваши классы.

Если вы сделаете это неправильно, например. если вы пропустили пространство имен, то вы, скорее всего, узнаете во время разработки или в ваших модульных тестах из-за "не найденного класса". Это хорошо, потому что это заставляет вас исправить это.

Classmap намного более прощает и позволит любую произвольную организацию файлов классов, оставляя читателя в темноте.

Итак, как уже говорили другие: используйте psr-4 или psr-0 в composer.json, работайте с ним во время разработки, а затем рассмотрите опцию -o для производства. Но измерьте, если это действительно приносит пользу производительности!

Ответ 5

Вопрос вводит в заблуждение.

"classmap", поскольку опция автозагрузки более точно представляет собой просто тупик-хранилище с ссылкой на каждый файл, с которым он сталкивается, и имеет класс с соответствующим именем. Затем он компилирует все это в "classmap array", в котором также содержатся правила PSR-0.

Итак, PSR-0 и classmap используют одну и ту же карту классов, что означает, что в буквальном смысле нет разницы.

Вы используете PSR-0, потому что хотите автозагрузить код PSR-0.