mirror of
https://github.com/yiisoft/yii.git
synced 2026-03-12 11:06:54 +01:00
98 lines
11 KiB
Plaintext
98 lines
11 KiB
Plaintext
Покращення продуктивності
|
||
============================
|
||
|
||
Продуктивність веб-додатків залежить від багатьох факторів. Головний з них — запити до бази даних, файлової системи і пропускної властивості мережі. В Yii, для зменшення втрат продуктивності через самий фреймворк, взятий до уваги кожен з цих факторів. Не дивлячись на це, багато частин додатку можна покращити, для одержання більшої продуктивності.
|
||
|
||
Включення розширення APC
|
||
------------------------
|
||
|
||
Включення [розширення PHP APC](http://php.net/manual/en/book.apc.php) — можливо, самий простий спосіб, щоб покращити загальну продуктивність додатку. Розширення оптимізує і кешує проміжний код
|
||
PHP і виграє час, який витрачається на інтерпретацію PHP при кожному запиті.
|
||
|
||
Відключення режиму налагодження
|
||
-------------------------
|
||
|
||
Відключення режиму налагодження, це ще один легкий спосіб збільшити продуктивність. Додаток Yii працює в режимі налагодження, якщо константа `YII_DEBUG` визначена як true. Режим налагодження корисний при розробці, але не найкращим чином впливає на продуктивність, через використання більшого числа компонентів. Для прикладу, при журналюванні помилок, з кожним повідомленням може записуватися додаткова інформація.
|
||
|
||
Використання `yiilite.php`
|
||
---------------------------
|
||
Якщо використовується [розширення PHP APC](http://php.net/manual/en/book.apc.php), ми можемо замінити `yii.php`, іншим завантажувачем — `yiilite.php`. Це дасть додатку ще більший приріст продуктивності.
|
||
|
||
Файл `yiilite.php` є в кожній версії Yii і являє собою, забрані разом, часто використовувані класи. Всі коментарі і вирази трасування вирізаються, через це використання `yiilite.php` зменшує кількість файлів які підключаються і виконуваного коду.
|
||
|
||
Варто відмітити, що використання `yiilite.php` без APC, може негативно відобразитися на продуктивності, так як `yiilite.php` включає в себе класи які можуть бути задіяні в кожному запиті і забираються деякий час на парсинг. Також було відмічено, що на деяких конфігураціях сервера `yiilite.php` повільніше, навіть при використанні APC. Найкращий спосіб для прийняття рішення — провести тест на включеному демонстраційному додатку `hello world`.
|
||
|
||
Використання кешування
|
||
----------------------
|
||
|
||
Як було описано в розділі«[кешування](/doc/guide/caching.overview)», Yii надає декілька рішень які зможуть значно збільшити продуктивність додатку. Якщо генерація деяких даних займає багато часу, ми можемо використовувати [кешування данних](/doc/guide/caching.data), щоб робити це не настільки часто. Якщо вся сторінка не міняється, можна використати [кешування сторінок](/doc/guide/caching.page).
|
||
|
||
Якщо використовується [Active Record](/doc/guide/database.ar), можна використати кешування структури бази данних. Це можна зробити, встановивши в налаштуваннях [CdbConnection::schemaCachingDuration] значення більше 0.
|
||
|
||
Окрім описаних налаштувань додатку можна використовувати кешування на рівні сервера. Описане вище [кэширование APC](/doc/guide/topics.performance#enabling-apc-extension) відноситься якраз до них. Є і інші рішення, такі як [Zend Optimizer](http://www.zend.com/en/products/guard/zend-optimizer), [eAccelerator](http://eaccelerator.net/)
|
||
і [Squid](http://www.squid-cache.org/).
|
||
|
||
Оптимізація бази даних
|
||
----------------------
|
||
|
||
Отримання даних з бази, часто є вузьким місцем продуктивності додатку. Не дивлячись на те, що кешування може помʼякшити втрати, воно не вирішує проблему повністю. Коли в базі зберігаються великі обсяги даних і потрібно поновити кеш, отримання даних може бути дуже витратним, при невірному складанні схеми, чи даних запиту.
|
||
|
||
Будьте уважні при виборі індексів. Їх використання може значно пришвидшити `SELECT`-запити, але значно уповільнити `INSERT`, `UPDATE` та `DELETE`.
|
||
|
||
Для складних запитів, рекомендується створити view в базі данних, замість виконання запитів з коду PHP, які СУБД розбирає кожен раз.
|
||
|
||
Не зловживайте [Active Record](/doc/guide/database.ar). Хоча [Active Record](/doc/guide/database.ar) і являється зручною проекцію даних в вигляді ООП, але продуктивність при її використанні, через використання обʼєктів для кожного рядка результату, падає.
|
||
Для додатків, що інтенсивно працюють з даними, рекомендується використання [DAO](/doc/guide/database.dao). Остання за рахунком, але не за значенням порада, використовуйте `LIMIT` в `SELECT`-запитах. Так ви зможете запобігти отриманню надлишкових даних з бази і витрати потрібної памяті, виділеної для PHP.
|
||
|
||
Мінімізація файлів скриптів
|
||
---------------------------
|
||
|
||
Складні сторінки часто включають велику кількість зовнішніх файлів JavaScript і CSS. Так як кожний файл дорівнює додатковому запиту до сервера, ми повинні зменшити число файлів шляхом їх злиття.
|
||
Також зайвим не буде зменшити розмір кожного з них, для зменшення часу витраченого для передачі по мережі. Існує не мало інструментів для виконування цих задач.
|
||
|
||
Для сторінки, яка генерується Yii, не виключено, що деякі скрипти підключаються компонентами, код котрих змінювати не хочеться (наприклад компоненти ядра Yii). Як мінімізувати такі скрипти, показано далі.
|
||
|
||
Для початку опишемо котрі скрипти потрібно мінімізувати. Задамо властивість [scriptMap|CClientScript::scriptMap] компонента [clientScript|CWebApplication::clientScript]. Це можна зробити як в налаштуваннях додатку, так і в коді. Наприклад.
|
||
|
||
~~~
|
||
[php]
|
||
$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](http://code.google.com/apis/ajaxlibs/). Наприклад, ми можемо підключити `jquery.js` з серверів Google, замість того, щоб використовувати свій сервер. Для того щоб це зробити, потрібно налаштувати `scriptMap` наступним чином.
|
||
|
||
~~~
|
||
[php]
|
||
$cs=Yii::app()->clientScript;
|
||
$cs->scriptMap=array(
|
||
'jquery.js'=>false,
|
||
'jquery.ajaxqueue.js'=>false,
|
||
'jquery.metadata.js'=>false,
|
||
…
|
||
);
|
||
~~~
|
||
Встановивши значення в false, ми забороняємо генерувати Yii для включення відповідних файлів. Замість того, підключимо їх з сервера Google.
|
||
|
||
~~~
|
||
[php]
|
||
<head>
|
||
<?php echo CGoogleApi::init(); ?>
|
||
|
||
<?php echo CHtml::script(
|
||
CGoogleApi::load('jquery','1.3.2') . "\n" .
|
||
CGoogleApi::load('jquery.ajaxqueue.js') . "\n" .
|
||
CGoogleApi::load('jquery.metadata.js')
|
||
); ?>
|
||
…
|
||
</head>
|
||
~~~
|
||
|
||
<div class="revision">$Id: topics.performance.txt 2890 2011-01-18 15:58:34Z qiang.xue $</div>
|