Производительность Symfony2 изначально отличается скоростью. Естественно, в случае необходимости можно увеличить быстродействие Symfony. Для этого существует много способов. В данной главе Вы познакомитесь с множеством наиболее распространённых и действенных из них.
Используйте кэширование байт-кода (например, APC)
Лучший (и самый простой) способ улучшить производительность – использовать кэширование байт-кода. Суть его заключается в устранении необходимости повторного компилирования исходного PHP-кода. Существует несколько байт-код кэшей, а некоторые из них доступны для свободного использования. Наиболее часто используемый тип – это, вероятно, APC.
Практика использования кэширования байт-кода практически не имеет недостатков и Symfony2 был разработан для взаимодействия со средами подобного типа.
Дальнейшая оптимизация
Обычно, байт-код кэш мониторит исходные файлы для выявления изменений. Таким образом, в случае изменений в исходном файле, байт-код гарантированно перекомпилируется в автоматическом режиме. Это удобно, но, определённо, связано с некоторыми издержками.
По этой причине некоторые байт-код кэши предлагает опцию, отменяющую проверку указанного типа. Естественно, что при отмене проверки обязанность чистки кэша после любого изменения исходника ложится на плечи администратора сервера. В противном случае, все внесённые изменения не будут отображаться.
К примеру, чтобы отключить проверку в APC, просто добавьте apc.stat=0 в файл конфигурации php.ini.
Используйте кэширующий автозагрузчик (например, ApcUniversalClassLoader)
По умолчанию, стандартное издание Symfony2 использует UniversalClassLoader в файле autoloader.php. Этот автозагрузчик прост в использовании, поскольку будет автоматически искать новые классы, размещённые Вами в зарегистрированных директориях.
К сожалению, за эту простоту приходиться расплачиваться: загрузчик последовательно повторяет все настроенные пространства имён в поисках конкретного файла, производя вызов file_exists до тех пор, пока нужный файл не будет обнаружен.
Простейшим решением в данном случае будет являться кэширование местоположения каждого класса после первого его размещения. Symfony содержит класс ApcUniversalClassLoader, загрузчик, расширяющий возможности UniversalClassLoader и хранящий месторасположения классов в APC.
Для использования этого загрузчика классов настройте Ваш autoloader.php следующим образом:
// app/autoload.php
require __DIR__.'/../vendor/symfony/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php';
use Symfony\Component\ClassLoader\ApcUniversalClassLoader;
$loader = new ApcUniversalClassLoader('some caching unique prefix');
// ...
При использовании автозагрузчика APC, после добавления новых классов, последние будут определяться автоматически и всё будет работать так же, как и прежде (т.е. исчезнет необходимость чистить кэш). Однако, если Вы меняете месторасположение конкретного пространства имён или приставки, потребуется внести соответствующие изменения в APC-кэш. В противном случае, автозагрузчик будет вести поиск классов, определённых в данном пространстве имён, в прежнем месторасположении.
Используйте файлы автозагрузки (Bootstrap Files)
Для обеспечения оптимальной гибкости и повторного использования кода приложения Symfony2 используют множество классов и внешних компонентов. Однако, загрузка всех этих классов из отдельных файлов при каждом запросе может стать определённым неудобством. Во избежание этого стандартное издание Symfony2 предоставляет скрипт для генерирования, так называемого, файла автозагрузки, состоящего из множества классовых определений, заключённых в единую оболочку. Путём внедрения этого файла (который содержит копии многих классов ядра) Symfony избавляется от необходимости добавления исходных файлов, содержащих необходимые классы. Это несколько сократит IO (работу в режиме интерпретации) жёсткого диска.
Если Вы используете стандартное издание Symfony2, то, возможно, уже пользуетесь файлами автозагрузки. Чтобы убедиться наверняка, откройте фронт-контроллер (это, как правило, app.php) и проверьте наличие следующей строки:
require_once __DIR__.'/../app/bootstrap.php.cache';
Обратите внимание: использование файла автозагрузки имеет два недостатка:
возникает необходимость в повторном генерировании файла всякий раз, когда изменяется какой-либо исходник (т.е. когда Вы обновляете исходник Symfony2 или сторонние библиотеки от производителя);
во время отладки потребуется размещение разделителей (break points) в файле автозагрузки.
При использовании стандартного издания Symfony2 файл автозагрузки создаётся заново (в автоматическом режиме) после обновления сторонних библиотек с помощью команды php bin/vendors install.
Файлы автозагрузки и кэширование бит-кода
Даже если Вы используете кэширование бит-кода, производительность можно улучшить с помощью файла автозагрузки, уменьшая количество файлов, мониторящих изменения. Естественно, если данная функция отключена в кэшировании бит-кода (например, apc.stat=0 в APC), потребность в использовании файла автозагрузки отпадает.
Оригинал статьи perfomance вы сможете найти на официальном сайте.