Быстродействие

Symfony2 быстр по умолчанию. Конечно, если вам действительно нужна скорость, существует много способов, которые помогут вам сделать Symfony ещё быстрее. В этой главе вы узнаете наиболее типичные и действенные способы для ускорения ваших приложений на Symfony.

Используйте Кэширование байт-кода (например, APC)

Самый простой и при этом самый лучший способ увеличить быстродействие приложения - использовать “кэширование байт-кода”. Идея такого кэширования заключается в устранении необходимости постоянно перекомпилировать PHP файлы с исходным кодом. В настоящее время доступно несколько таких кэшеров, узнать подробнее о которых вы можете в Википедии на странице инструменты для кэширования байт-кода. Некоторые из этих программ имеют открытый исходный код. Наиболее распространённым кэшером байт-кода, вероятно, является APC.

Кэширование байт-кода не имеет недостатков и Symfony2 разработан для успешного функционирования в таком окружении.

Дальнейшие оптимизации

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

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

Например, для отключения проверки модификации файлов в APC просто добавьте строку apc.stat=0 в ваш файл php.ini.

Используйте кэширующий автозагрузчик (например ApcUniversalClassLoader)

По умолчанию Symfony2 Standard Edition использует UniversalClassLoader в файле autoloader.php. Этот автозагрузчик прост в использовании, так как он автоматически обнаруживает любые новые классы, которые вы помещаете в зарегистрированные директории.

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

Простейшим решением является кэширование места расположения каждого класса, после того как он был найден в первый раз. Symfony также имеет класс ApcUniversalClassLoader, который унаследован от UniversalClassLoader и сохраняет расположение класса в APC.

Для использования этого загрузчика, измените ваш autoloader.php следующим образом:

<?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');
// ...

Note

При использовании автозагрузчика APC, если вы добавляете новые классы, они будут найдены автоматически и всё будет работать, как и прежде (без необходимости очистки кэша). Тем не менее, если вы меняете расположение некоторого пространства имён или же префикса - вам нужно очистить кэш APC. В противном случае, автозагрузчик будет по прежнему пытаться найти классы этого пространства имён по старому “адресу”.

Файлы для начальной загрузки (Bootstrap)

Для того чтобы обеспечить оптимальную гибкость и возможности для повторного использования кода, приложения Symfony2 используют множество классов и сторонних компонентов. Но загрузка всех этих классов из разнообразных файлов создаёт дополнительную нагрузку. Для уменьшения этой нагрузки, Symfony2 Standard Edition предоставляет скрипт для генерации файла начальной загрузки (bootstrap file), состоящего из определений многих классов собранных в одном месте. Подключив этот единственный файл (который содержит копии многих классов ядра), Symfony больше не требуется подключать исходники, содержащие эти классы. Это существенно снижает IO жёсткого диска.

Если вы используете Symfony2 Standard Edition, вы уже вероятно используете файл начальной загрузки. Для того чтобы удостовериться в этом, откройте ваш фронт-контроллер (как правило app.php) и проверьте, что там есть строка:

<?php
require_once __DIR__.'/../app/bootstrap.php.cache';

Отметим также два недостатка при использовании bootstrap-файла:

  • Этот файл необходимо создавать заново, если оригинальные исходники изменились (например, это может быть вызвано обновлением Symfony2 или сторонних библиотек);
  • При отладке точки останова (break points) надо делать внутри файла bootstrap.

При использовании Symfony2 Standard Edition файл bootstrap автоматически пересоздаётся после обновления библиотек при помощи команды php bin/vendors install.

Файлы начальной загрузки и кэширование байт-кода

Даже при использовании кэширования байт-кода производительно улучшится, если вы будете использовать bootstrap файл, так как потребуется мониторить меньше файлов. Если же эта функция отключена (например apc.stat=0 в APC), смысла в использовании файла начальной загрузки более уже нет.