Производительность

Производительность

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

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

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

Существует много кешей байт-кода, нкоторые из которых общедоступны. С выхода PHP 5.5, PHP поступает со встроенным OPcache. В более старых версиях наиболее используемым байт-кодом является APC.

Tip

Если ваш сервер все еще использует наследование расширения PHP APC, установите компонент APCu Polyfill в вашем приложении, чтобы включить совместимость с функциями APCu PHP и получить доступ к поддержке для продвинутых функций Symfony, таких как адаптер кеша APCu Cache.

Использование кеширования байт-кода на самом деле не имеет недостатков, и Symfony была сделана так, чтобы работать очень хорошо в подобной среде.

Мониторинг изменений в исходных файлах

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

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

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

По тем же причинам, кеширование байт-кода также должно быть очищено при запуске приложения (например, посредством вызова PHP-функции apc_clear_cache() при использовании APC и opcache_reset() при использовании OPcache).

Note

В PHP, CLI и веб-процессы не используют один и тот же OPcache. Это означает, что вы не можете очистить веб-сервер OPcache выполняя какую-то команду в вашем терминале. Вам нужно либо перезапустить веб-сервер, либо вызвать функции apc_clear_cache() или opcache_reset() через веб-сервер (т.е. иметь их в скрипте, который вы выполняете через сеть).

Оптимизация всех файлов, используемых Symfony

По умолчанию, OPcacheсохраняет до 2,000 файлов в кеше байт-кода. Это число слишком маленькое для типичного приложения Symfony, так что вам стоит установить лимит повыше с помощью опции конфигурации opcache.max_accelerated_files:

1
2
; php.ini
opcache.max_accelerated_files = 20000

Конфигурация кеша PHP realpath

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

По умолчанию, PHP устанавливает realpath_cache_size в 16K, что очень мало для Symfony. Подумайте о том, чтобы обновить это значение как минимум до 4096K. Кроме того, кешированные пути сохраняются только на 120 по умолчанию. Подумайте о том, чтобы обновить это значение, используя опцию realpath_cache_ttl:

1
2
3
; php.ini
realpath_cache_size=4096K
realpath_cache_ttl=600

Использование функционала компоновщика «класс маршрутов»

По умолчанию, Symfony Standard Edition (стандартная версия) использует автозагрузчик компоновщика из файла autoload.php . Этот автозагрузчик легко использовать, и он автоматически будет находить все новые классы, которые вы разместите в зарегистрированных каталогах.

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

The simplest solution is to tell Composer to build an optimized "class map", which is a big array of the locations of all the classes and it's stored in vendor/composer/autoload_classmap.php.

Rласс маршрутов может быть сгенерирован из командной строки, и может стать частью вашего процесса запуска:

1
$ composer dump-autoload --optimize --no-dev --classmap-authoritative
--optimize
Сбрасывает каждый совместимый с PSR-0 и PSR-4 класс, используемый в вашем приложении.
--no-dev
Исключает классы, которые только нужны при разработке окружения (например, тесты).
--classmap-authoritative
Предотвращает компилировщик от сканирования системы файлов на наличие классов, которые не найдены в классе маршрутов.

Кэширование автозагрузчика с APC

Еще одним решением может стать кеширование расположения каждого класса, после того, как был обнаружен в первый раз. Symfony автоматически включает в себя класс ApcClassLoader, который делает именно это. Для того, чтобы использовать его, просто адаптируйте файл вашего фронт-контроллера. Если вы используете стандартное распределение, внесите следующие изменения:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// app.php
// ...

use Symfony\Component\ClassLoader\ApcClassLoader;

$loader = require __DIR__.'/../app/autoload.php';
include_once __DIR__.'/../app/bootstrap.php.cache';

// Использовать автозагрузку APC для улучшения производительности
// Изменить 'sf2' по префиксу в желаемом вами порядке
// чтобы избежать конфликта с другим приложением
$loader = new ApcClassLoader('sf2', $loader);
$loader->register(true);

// ...

Чтобы узнать большe, см. Cache a Class Loader.

Note

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

Использование файлов начальной загрузки

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

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

1
include_once __DIR__.'/../var/bootstrap.php.cache';

Заметьте, что в использовании файла начальной загрузки также есть два недостатка:

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

При использовании Symfony Standard Edition файл начальной загрузки автоматически пересоздаётся после обновления библиотек при помощи команды composer install.

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

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

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.