Продуктивність

20/07/2016 0 symfony, розробка

Symfony — швидкий фреймворк. Звичайно, якщо вам потрібна реальна швидкість, є багато способів, за допомогою яких ви можете зробити Symfony ще швидшим. В цьому розділі, ви відкриєте для себе багато популярних і  ефективних способів, як зробити  додаток Symfony надзвичайно швидким.

Кеш байткоду (наприклад, APC)

Один з найкращих і найлегших способів як покращити продуктивність — це використати "кеш байт-коду". Ідея кешу байткоду полягає у тому, щоб позбавитися необхідності постійно заново компілювати вихідний код PHP. Існує багато кешів байткоду, деякі з них є відкритим програмним забезпеченням. У PHP 5.5, PHP містить вбудований OPcache. Старіші версії, використовують кеш байткоду APC.

Використання кешу байт коду не має недоліків, і фреймворк Symfony був спроектований для роботи в цьому середовищі.

Наступні оптимізації

Кеші байткоду зазвичай контролють вихідні файли для змін. Це дає гарантію, що якщо змінюється джерело файлу, байткод компілюватиметься автоматично. Це дійсно зручно, хоча і додає трішки складності.

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

Наприклад, щоб вимкнути ці перевірки у APC, просто додайте apc.stat=0 до кофігурації php.ini.

Використовуємо функціонал “карти класів” разом з Composer

За замовчуванням, стандартний фреймворк Symfony використовує автозавантажувач (Composer's autoloader) у файлі autoload.php. Ним легко користуватися, адже автозавантажувач автоматично знаходить нові класи, які ви розмістили у зареєстрованих директоріях.  

На жаль, це складний процес, так як завантажувач перебирає усі налаштовані заповнювачі, щоб знайти конкретний файл, роблячи виклики file_exists, поки не знайде файл, який він шукає.

Найпростіше рішення — дати команду Composer побудувати "карту класів" (тобто, великий масив з розміщеннями класів). Це можна зробити з командного рядка, а також може стати частиною процесу розгортання:

$ composer dump-autoload --optimize

Всередині, він будує великий масив мапи класів у файлі vendor/composer/autoload_classmap.php.

Кешування автозавантажування з APC

Інше рішення — кешувати розташування кожного класу після того, як він буде розміщений у своїй локації уперше. Symfony містить клас — ApcClassLoader — і саме він виконує таку функцію. Щоб розпочати роботу, просто адаптуйте свій файл фронт-контролера. Якщо ви використовуєте Standard Distribution, цей код вже повинен бути доступний в якості коментарів в цьому файлі:

// app.php

// ...
$loader = require __DIR__.'/../app/autoload.php';
include_once __DIR__.'/../var/bootstrap.php.cache';
// Enable APC for autoloading to improve performance.
// You should change the ApcClassLoader first argument to a unique prefix
// in order to prevent cache key conflicts with other applications
// also using APC.
/*
$apcLoader = new Symfony\Component\ClassLoader\ApcClassLoader(sha1(__FILE__), $loader);
$loader->unregister();
$apcLoader->register(true);
*/

// ...

Більше інформації читайте у розділі Cache a Class Loader.

При використанні автозавантажувача APC, якщо ви додасте нові класи, він знайде їх автоматично, і все буде працювати так само як і раніше (тобто без будь-якої причини "очистити" кеш). Проте, якщо ви змінили місце розташування заповнювача або префікса, вам потрібно очистити кеш APC. В іншому випадку, автозавантажувач все одно буде шукати класи всередині заповнювача у старій локації.   

Використовуйте файли Bootstrap

Для забезпечення оптимальної гнучкості і повторного використання коду, додатки Symfony використовують різні  і сторонні компоненти. Але завантаження всіх цих класів з окремих файлів на кожен запит може привести до ускладнень. Щоб зменшити це навантаження, то Symfony Standard Edition надає скрипт для створення так званого bootstrap file, що складається з декількох визначень класів в одному файлі. Включаючи цей файл (який містить копії багатьох основних класів), Symfony більше не потрібно включати в себе будь-які з файлів, що містять ці класи. Це дозволить зменшити диск IO.

Якщо ви використовуєте Symfony Standard Edition, то ви, ймовірно, вже  мали справу з файлом bootstrap. Щоб переконатись, відкрийте фронт-контролер (зазвичай app.php) і перевірте, чи є наступний рядок:

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

Проте використання файлу bootstrap передбачає натупні недоліки:

  • файл повинен бути щоразу згенерований заново, коли змінено будь-яке базове джерело (тобто при оновленні джерела Symfony, або бібліотек вендора);

  • при дебагінгу, треба буде поставити точки зупинки всередині файлу bootstrap.

Якщо ви використовуєте Symfony Standard Edition, файл bootstrap автоматично перебудовується після поновлення бібліотеки вендора через команду composer install.

Файли Bootstrap і кеши байткоду

Навіть коли ви будете користуватися кешом байткоду, продуктивність покращитьсся лише тоді, коли ви задієте файл bootstrap file, оскільки менше файлів слідкуватиме за змінами. Звичайно, якщо ця властивість не працюватиме у кеші байткоду (наприклад,  apc.stat=0 у APC), тоді немає ніякої потреби використовувати файл bootstrap.

Поділитися