Производительность Zend Framework (автозагрузка)

Я прочитал много статей о производительности ZF и до сих пор не могу понять, если я включил кэширование байт-кода (APC), есть ли смысл использовать какие-то другие трюки? Например. отключив автозагрузку и используя вместо этого один большой php-файл со всеми необходимыми классами.


person heximal    schedule 30.04.2011    source источник
comment
Возможный дубликат stackoverflow.com/questions/3777765 / для некоторых идей.   -  person David Weinraub    schedule 01.05.2011


Ответы (1)


Я был удивлен, обнаружив, что это единственный вопрос на сайте с тегами производительности, автозагрузки, php. Что может быть лучше, чем это, чтобы развеять миф об автозагрузке № 1:

Современные, хорошо спроектированные автозагрузчики не сломают APC (или OPcache PHP 5.5) и не хуже по производительности, чем require_once (за исключением накладных расходов на вызов функции, конечно).

Почему? Что ж, теперь у нас есть spl_autoload_register, который позволяет добавлять несколько обработчиков автозагрузки. Это позволяет каждой сторонней библиотеке поставлять свой собственный автозагрузчик, который знает, как загружать файлы этой библиотеки, и пропускать остальные.

Например, Zend_Loader_Autoloader Zend Framework 1 ограничивает себя попыткой загрузить классы, которые начинаются с определенного псевдопространства имен -- Zend_ (и все остальное, что пользователь попросит загрузить). Если он не запускается с желаемым псевдопространством имен, он просто возвращается и позволяет запуститься следующему загрузчику в стеке. Он также знает, что может найти Zend_Foo_Bar_Baz в Zend/Foo/Bar/Baz.php, поэтому ему не нужно искать путь включения вручную. Как и другие автозагрузчики современных фреймворков, он следует стандарту автозагрузки PSR-0.

Любые зависимости, установленные через composer, также таким же образом получают автоматически созданные автозагрузчики с пространством имен.

Именно это включает в себя очистку пути, что делает плохо спроектированные автозагрузчики отстойными. Обычно вы не видите их в современном PHP-коде. Интенсивные вызовы файловой системы stat, возникающие в результате попыток найти файлы, часто снижают производительность. Ознакомьтесь с этой презентацией создателя PHP Расмуса Лердорфа, в которой он увеличивает производительность Wordpress посредством сравнительного анализа, профилирование и тщательное удаление медленных операций, таких как вызовы stat.

require_once-все, что было в прошлом, не нужно, когда вы используете современные библиотеки и у вас нет отстойного автозагрузчика. Это большая победа только тогда, когда вы отключаете apc.stat если вы используете APC или возитесь с параметрами OPcache validate_, revalidate_ и enable_file_override INI если вы используете OPcache.

tl;dr: Если вы не знаете, что statвключение включаемых файлов является самым большим узким местом, автозагрузчик Zend вполне подойдет, и вам не нужно прибегать к require_once фестивалю.

person Charles    schedule 01.05.2011
comment
Спасибо за такой подробный ответ, для меня это очень ценная информация. Я не забыл об этом. Все это время искал)) - person heximal; 06.05.2011