9 кроків з оптимізації YII
Звичайна установка веб-фреймворку Yii не використовує багатьох механізмів, які можуть зробити Вашу програму значно швидше. Подивимося на пропускну здатність програми blog (один із прикладів Yii) у стандартній поставці.
Для аналізу пропускної здатності скористаємося інструментом Apache Benchmark:
# 30 запитів на секунду видає сервер на стандартній установці Yii
Скромний сервер 512 Мб оперативної пам'яті з одним ядром здатний буде витримати 30 запитів в секунду. Цей показник можна значно покращити.
Клієнтська оптимізація
Оптимізація програми на стороні браузера може збільшити швидкість роботи в кілька разів. Починати слід саме з цього.
1. Стиснення Gzip

Переконайтеся, що у програмі включена компресія текстових даних. Це дозволить зменшити розміру сторінок, що віддаються, у кілька разів. У Nginx'e компресія включається так:
Повну конфігурацію Nginx для програм Yii можна подивитися тут.
2. Клієнтське кешування

Кешування файлів статики у браузері дасть відчутний виграш у швидкості сайту для відвідувачів. Кількість запитів від відвідувача до сервера значно зменшиться. Іноді це може збільшити швидкість роботи сайту кілька разів. Крім цього, клієнтське кешування зменшить навантаження на сервер.
Nginx'e включається так:
# Включаємо клієнтське кешування для файлів статики
Оскільки файли CSS/JS можуть змінюватися, скористаємося методикою версіонування статики керувати клієнтським кешем. Для CSS:
# CSS версії для керування кешем у браузері
Для версіонування Javascript потрібно використовувати метод scriptMap():
Javascript версії для керування кешем у браузері
3. Мініфікація тасклеювання статики

Декілька CSS файлів – це кілька HTTP запитів. Набагато краще мати один CSS-файл, щоб клієнту не доводилося робити багато запитів. Те саме стосується і Javascript'a. Для використання цього в Yii необхідно використовувати сторонній компонент мініфікації (наприклад, компресор YUI) і переписати завантаження JS/CSS файлів в HTML.
Мініфікація
Спочатку всі Javascript файли необхідно "склеїти" в один файл all.js. Після цього виконати мініфікацію за допомогою YUI compressor:
Те саме робимо для CSS - в all.css:
Тепер необхідно завантажити потрібні файли в HTML:
# Завантаження мініфікованих JS/CSS файлів
Слід враховувати, що таку процедуру мініфікації необхідно робити після кожної зміни Javascript або CSS. Проте немає необхідності використовувати це в середовищі розробки. Тому цей процес підготовки статики буде зручно вбудувати в deploy-скрипт.
Серверна оптимізація
Серверна оптимізація впливає швидкість генерації сторінок. Час генерації сторінок зазвичай не так важливий для відвідувача. Натомість це визначає кількість запитів, які зможе обробити сервер в одиницю часу. Чим краще оптимізована програма, тим більше клієнтів зможе обслужити сервер.
4. Оптимізація PHP

Основним і обов'язковим кроком оптимізації PHP, на якому написаний Yii, є установка системи кешування байт-коду. Використовуйте OpCache або APC для версії PHP більше або менше 5.5 відповідно. Кешування байткоду дозволяє заощадити на читанні та компіляції файлів. Це розвантажить процесор та прискорить роботу програми.
5. Вимкнення режиму налагодження

Не забудьте вимкнути режим налагодження. Константа YII_DEBUG має бутивстановлена в false:
6. Спрощений завантажувач

Щоб увімкнути завантажувач yiilite.php, відредагуйте index.php:
7. MySQL Запити

ActiveRecord може будувати дуже складні запити чи його серії. Аналізуйте такі ситуації за допомогою профілювання. У виявлених випадках використовуйте компонент DAO для побудови прямих SQL-запитів:
# Запит на MySQL з індексами може працювати набагато швидше, ніж серія запитів на PHP
8. Кешування запитів

Кешування важких запитів є невід'ємною частиною оптимізації будь-яких програм. Yii підтримує кешування на основі Memcache. Для його включення необхідно вказати налаштування кешу у файлі protected/config/main.php:
Тепер ми можемо використовувати метод cache() для кешування будь-якого запиту:
# Кешуємо запит до моделі Post на 60 секунд
9. Кешування сторінок
Кешування сторінок - один із найпотужніших методів прискорення сайтів. Така методика добре підходить для сайтів, які нечасто змінюються (наприклад, блоги/новини/магазини). Для кешування сторінок у Yii необхідно в контролері змінити обробник filters():
# Закешує сторінки цього контролера на 60 секунд
Крім цього, Yii дозволяє вказати параметр, за унікальним значенням якого зберігатимуться дані. Наприклад, ми хочемо зберігати кеш окремо для кожного запису у блозі. Тоді необхідно використовувати GET параметр ># Закешує сторінки окремо для кожного значення GET параметру ID
Проведемо повторний тест програми:
# Бачимо зменшення часу генерації сторінки в 10 разів
Швидкість роботи і кількість запитів, що обробляються в секунду, відрізняються на порядок на краще. Основний приріст упродуктивності принесло кешування сторінок.
Крім цього, клієнтський показник оптимізації зріс до 93/100. Хороший рівень для більшості сайтів.
Найважливіше
Оптимізація програми на платформі Yii може збільшити його швидкість у кілька разів. Використовуйте оптимізацію клієнта для збільшення швидкості роботи для відвідувачів. Серверна оптимізація дозволить витримати більше відвідувачів, не купуючи дорожчі сервери.
Клієнтська оптимізація Web сайту
Швидка генерація даних для MySQL таблиць
Тестування онлайнових запитів за допомогою hurl.it
Оптимізація JPEG картинок
Онлайн оптимізація PNG
Мініфікація (minify) HTML
Аналіз навантаження на процесор
Інструмент для гарячих бекапів MySQL
5 методик використання lazy loading для оптимізації
Методи оптимізації сайтів на стороні браузерів
Вибір формату зображень та типу стиснення
Аналіз повільних PHP скриптів за допомогою XHprof
Відстеження швидкості завантаження сторінок у Google Analytics
Перевірка роботи Mysql під навантаженням Sysbench
Кешування динамічних сторінок за допомогою SSI
Що означає високе навантаження (highload) і що при цьому робити?