Продуктивність веб-додатків залежить від багатьох факторів. Головний з них — запити до бази даних, файлової системи і пропускної властивості мережі. В Yii, для зменшення втрат продуктивності через самий фреймворк, взятий до уваги кожен з цих факторів. Не дивлячись на це, багато частин додатку можна покращити, для одержання більшої продуктивності.
Включення розширення PHP APC — можливо, самий простий спосіб, щоб покращити загальну продуктивність додатку. Розширення оптимізує і кешує проміжний код PHP і виграє час, який витрачається на інтерпретацію PHP при кожному запиті.
Відключення режиму налагодження, це ще один легкий спосіб збільшити продуктивність. Додаток Yii працює в режимі налагодження, якщо константа YII_DEBUG
визначена як true. Режим налагодження корисний при розробці, але не найкращим чином впливає на продуктивність, через використання більшого числа компонентів. Для прикладу, при журналюванні помилок, з кожним повідомленням може записуватися додаткова інформація.
yiilite.php
#Якщо використовується розширення PHP APC, ми можемо замінити yii.php
, іншим завантажувачем — yiilite.php
. Це дасть додатку ще більший приріст продуктивності.
Файл yiilite.php
є в кожній версії Yii і являє собою, забрані разом, часто використовувані класи. Всі коментарі і вирази трасування вирізаються, через це використання yiilite.php
зменшує кількість файлів які підключаються і виконуваного коду.
Варто відмітити, що використання yiilite.php
без APC, може негативно відобразитися на продуктивності, так як yiilite.php
включає в себе класи які можуть бути задіяні в кожному запиті і забираються деякий час на парсинг. Також було відмічено, що на деяких конфігураціях сервера yiilite.php
повільніше, навіть при використанні APC. Найкращий спосіб для прийняття рішення — провести тест на включеному демонстраційному додатку hello world
.
Як було описано в розділі«кешування», Yii надає декілька рішень які зможуть значно збільшити продуктивність додатку. Якщо генерація деяких даних займає багато часу, ми можемо використовувати кешування данних, щоб робити це не настільки часто. Якщо вся сторінка не міняється, можна використати кешування сторінок.
Якщо використовується Active Record, можна використати кешування структури бази данних. Це можна зробити, встановивши в налаштуваннях CdbConnection::schemaCachingDuration значення більше 0.
Окрім описаних налаштувань додатку можна використовувати кешування на рівні сервера. Описане вище кэширование APC відноситься якраз до них. Є і інші рішення, такі як Zend Optimizer, eAccelerator і Squid.
Отримання даних з бази, часто є вузьким місцем продуктивності додатку. Не дивлячись на те, що кешування може помʼякшити втрати, воно не вирішує проблему повністю. Коли в базі зберігаються великі обсяги даних і потрібно поновити кеш, отримання даних може бути дуже витратним, при невірному складанні схеми, чи даних запиту.
Будьте уважні при виборі індексів. Їх використання може значно пришвидшити SELECT
-запити, але значно уповільнити INSERT
, UPDATE
та DELETE
.
Для складних запитів, рекомендується створити view в базі данних, замість виконання запитів з коду PHP, які СУБД розбирає кожен раз.
Не зловживайте Active Record. Хоча Active Record і являється зручною проекцію даних в вигляді ООП, але продуктивність при її використанні, через використання обʼєктів для кожного рядка результату, падає.
Для додатків, що інтенсивно працюють з даними, рекомендується використання DAO. Остання за рахунком, але не за значенням порада, використовуйте LIMIT
в SELECT
-запитах. Так ви зможете запобігти отриманню надлишкових даних з бази і витрати потрібної памяті, виділеної для PHP.
Складні сторінки часто включають велику кількість зовнішніх файлів JavaScript і CSS. Так як кожний файл дорівнює додатковому запиту до сервера, ми повинні зменшити число файлів шляхом їх злиття. Також зайвим не буде зменшити розмір кожного з них, для зменшення часу витраченого для передачі по мережі. Існує не мало інструментів для виконування цих задач.
Для сторінки, яка генерується Yii, не виключено, що деякі скрипти підключаються компонентами, код котрих змінювати не хочеться (наприклад компоненти ядра Yii). Як мінімізувати такі скрипти, показано далі.
Для початку опишемо котрі скрипти потрібно мінімізувати. Задамо властивість scriptMap компонента clientScript. Це можна зробити як в налаштуваннях додатку, так і в коді. Наприклад.
$cs=Yii::app()->clientScript;
$cs->scriptMap=array(
'jquery.js'=>'/js/all.js',
'jquery.ajaxqueue.js'=>'/js/all.js',
'jquery.metadata.js'=>'/js/all.js',
…
);
Наведений код, зробить файли JavaScript доступними за URL /js/all.js
.
Якщо який-небудь з цих файлів потрібен для яких-небудь компонентів, Yii підключить URL (один раз), замість того, щоб підключати файли окремо. Нам потрібно використовувати який-небудь інструмент для злиття (і можливо, стиснення) JavaScript в один файл і записати результат в js/all.js
.
Збільшити швидкість завантаження сторінки можна також за допомогою Google AJAX Libraries API. Наприклад, ми можемо підключити jquery.js
з серверів Google, замість того, щоб використовувати свій сервер. Для того щоб це зробити, потрібно налаштувати scriptMap
наступним чином.
$cs=Yii::app()->clientScript;
$cs->scriptMap=array(
'jquery.js'=>false,
'jquery.ajaxqueue.js'=>false,
'jquery.metadata.js'=>false,
…
);
Встановивши значення в false, ми забороняємо генерувати Yii для включення відповідних файлів. Замість того, підключимо їх з сервера Google.
<head>
<?php echo CGoogleApi::init(); ?>
echo CHtml::script(
CGoogleApi::load('jquery','1.3.2') . "\n" .
CGoogleApi::load('jquery.ajaxqueue.js') . "\n" .
CGoogleApi::load('jquery.metadata.js')
); ?>
…
</head>
Якщо ваш проект використовує ресурси у великій кількості,
то ви можете поліпшити його продуктивність за допомогою
символічних посилань замість копії файлів.
Для того, щоб увімкнути його необхідно налаштувати властивість
linkAssets компонента додатку assetManager
за допомогою файла конфігурації protected/config/main.php
:
return array(
// ...
'components' => array(
// ...
'assetManager' => array(
'linkAssets' => true,
),
),
);
Слід зазначити, що це може вимагати додаткового налаштування.