Обычная установка веб-фреймворка Yii не использует многих механизмов, которые могут сделать Ваше приложение значительно быстрее. Посмотрим на пропускную способность приложения blog (один из примеров Yii) в стандартной поставке.
Для анализа пропускной способности воспользуемся инструментом Apache Benchmark:
# ab -c 5 -n 50 http://yii.ruhighload.com/ ... Total transferred: 265750 bytes HTML transferred: 248150 bytes Requests per second: **30.28** [#/sec] (mean) Time per request: 165.119 [ms] (mean) Time per request: **33.024** [ms] (mean, across all concurrent requests) Transfer rate: 157.17 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 2.5 0 11 Processing: 46 163 66.6 137 365 Waiting: 46 156 66.5 133 363 Total: 46 163 67.1 137 365 Percentage of the requests served within a certain time (ms) 50% 137 66% 163 75% 196 80% 213 90% 287 95% 318 98% 365 99% 365 100% 365 (longest request)
## 30 запросов в секунду выдает сервер на стандартной установке Yii
Скромный сервер в 512 Мб оперативной памяти с одним ядром способен будет выдержать 30 запросов в секунду. Этот показатель можно значительно улучшить.
Кроме этого, уровень клиентской оптимизации – 80 из 100. Самые важные проблемы:
Оптимизация приложения на стороне браузера может увеличить скорость его работы в несколько раз. Начинать следует именно с этого.
Убедитесь, что у в приложении включена компрессия текстовых данных. Это позволит уменьшить размера отдаваемых страниц в несколько раз. В Nginx’e компрессия включается так:
server {
…
**gzip on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;**
…
}
## Включаем Gzip
Полную конфигурацию Nginx для приложений Yii можно посмотреть тут.
Кэширование файлов статики в браузере даст ощутимый выигрыш в скорости сайта для посетителей. Количество запросов от посетителя к серверу сильно снизится. Иногда это может увеличить скорость работы сайта в несколько раз. Кроме этого, клиентское кэширование снизит нагрузку на сервер.
В Nginx’e включается так:
location ~ .(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
**expires max;**
}
## Включаем клиентское кэширование для файлов статики
Поскольку файлы CSS/JS могут изменяться, воспользуемся методикой версионирования статики для управления клиентским кэшем. Для CSS:
**<? $css_version = 1; ?>**
## CSS версии для управления кэшем в браузере
Для версионирования Javascript нужно использовать метод scriptMap():
<? $cs=Yii::app()->clientScript;
**$js_version = 1;**
$cs->scriptMap = array(
**'jquery.min.js' => '/assets/a898d977/jquery.min.js?' . $js_version,
'jquery.ba-bbq.min.js' => '/assets/a898d977/jquery.ba-bbq.min.js?' . $js_version,
'jquery.yiilistview.js' => '/assets/5c8d3411/listview/jquery.yiilistview.js?' . $js_version,**
); ?>**
…
## Javascript версии для управления кэшем в браузере
Несколько CSS файлов – это несколько HTTP запросов. Намного лучше иметь один CSS файл, чтобы клиенту не приходилось делать много запросов. То же самое касается и Javascript’a. Для использования этого в Yii необходимо использовать сторонний компонент минификации (например, YUI компрессор) и переписать загрузку JS/CSS файлов в HTML.
Сначала все Javascript файлы необходимо “склеить” в один файл all.js. После этого – выполнить минификацию с помощью YUI compressor:
cat assets/a898d977/jquery.min.js assets/a898d977/jquery.ba-bbq.min.js assets/5c8d3411/listview/jquery.yiilistview.js > all.js java -jar /path/to/**yui.jar** all.js -o all.js
## Javascript минификация
То же самое делаем для CSS – в all.css:
cat css/screen.css css/print.css css/main.css css/form.css assets/78f165f3/highlight.css assets/a6d257ef/pager.css assets/5c8d3411/listview/styles.css > all.css java -jar /path/to/**yui.jar** all.css -o all.css
## CSS минификация
Теперь необходимо загрузить нужные файлы в HTML:
**$js_version = 1;
$css_version = 1;**
$cs->scriptMap=array(
**'jquery.min.js' => 'all.js?' . $js_version,
'jquery.ba-bbq.min.js' => 'all.js?' . $js_version,
'jquery.yiilistview.js' => 'all.js?' . $js_version,
'pager.css' => 'all.css?' . $css_version,
'highlight.css' => 'all.css?' . $css_version,
'styles.css' => 'all.css?' . $css_version,**
);?>
…
## Загрузка минифицированных JS/CSS файлов
Следует учитывать, что такую процедуру минификации необходимо проделывать после каждого изменения в Javascript или CSS. Зато нет необходимости использовать это в среде разработки. Поэтому этот процесс подготовки статики будет удобно встроить в deploy-скрипт.
Серверная оптимизация влияет на скорость генерации страниц. Время генерации страниц обычно не так важно для посетителя. Зато это определяет количество запросов, которое сможет обработать сервер в единицу времени. Чем лучше оптимизировано приложение, тем больше клиентов сможет обслужить сервер.
Основным и обязательным шагом по оптимизации PHP, на котором написан Yii, является установка системы кэширования байт-кода. Используйте OpCache либо APC для версия PHP больше или меньше 5.5 соответственно. Кэширование байткода позволяет сэкономить на чтении и компиляции файлов. Это разгрузит процессор и ускорит работу приложения.
Не забудьте отключить режим отладки. Константа YII_DEBUG должна быть установлена в false:
define('**YII_DEBUG**', false);
Использование упрощенного загрузчика yiilite.php может быть полезно для небольших приложений. Он содержит основные классы без комментариев в одном файле.
Для включения загрузчика yiilite.php, отредактируйте index.php:
…
$yii=dirname(__FILE__).’/../../framework/**yiilite.php**’;
$config=dirname(__FILE__).’/protected/config/main.php’;
ActiveRecord может строить очень сложные запросы либо их серии. Анализируйте подобные ситуации с помощью профилирования.
В обнаруженных случаях используйте компонент DAO для построения прямых SQL-запросов:
## Запрос на MySQL с [p49 индексами] может работать намного быстрее, чем серия запросов на PHP
Кэширование тяжелых запросов является неотъемлемой частью оптимизации любых приложений. Yii поддерживает кэширование на основе Memcache. Для его включения, необходимо указать настройки кэша в файле protected/config/main.php:
<? return array(
...
'components'=>array(
…
**’cache’=>array(
‘class’=>’system.caching.CMemCache’,
‘servers’=>array(
array(‘host’=>’127.0.0.1’, ‘port’=>11211),
),
),**
…
## Подключаем Memcache
Теперь мы можем использовать метод cache() для кэширования любого запроса:
$posts = Post::model()->**cache(60)**->findAll();
## Кэшируем запрос к модели Post на 60 секунд
Кэширование страниц – один из самых мощных методов ускорения сайтов. Такая методика хорошо подходит для сайтов, которые нечасто изменяются (например, блоги/новости/магазины). Для кэширования страниц в Yii необходимо в контроллере изменить обработчик filters():
),**
);
}
## Закэширует страницы этого контроллера на 60 секунд
Кроме этого Yii позволяет указать параметр, по уникальному значению которого будут сохраняться данные. Например, мы хотим сохранять кэш отдельно для каждой записи в блоге. Тогда необходимо использовать GET параметр ID, как переменную часть ключа:
**'varyByParam'=>array('id'),**
),
);
}
## Закэширует страницы отдельно для каждого значения в GET параметре ID
Проведем повторный тест приложения:
# ab -c 5 -n 50 http://yii.ruhighload.com/ ... Total transferred: 224450 bytes HTML transferred: 216500 bytes Requests per second: **387.81** [#/sec] (mean) Time per request: 12.893 [ms] (mean) Time per request: **2.579** [ms] (mean, across all concurrent requests) Transfer rate: 1700.07 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 2.0 0 9 Processing: 5 12 2.1 12 15 Waiting: 2 11 2.7 11 14 Total: 8 12 1.9 12 20 Percentage of the requests served within a certain time (ms) 50% 12 66% 13 75% 14 80% 14 90% 14 95% 15 98% 20 99% 20 100% 20 (longest request)
## Видим уменьшение времени генерации страницы в 10 раз
Скорость работы и количество обрабатываемых запросов в секунду отличаются на порядок в лучшую сторону. Основной прирост в производительности принесло кэширование страниц.
Кроме этого, клиентский показатель оптимизации вырос до 93 / 100. Хороший уровень для большинства сайтов.
Оптимизации приложения на платформе Yii может увеличить его скорость в несколько раз. Используйте клиентскую оптимизацию для увеличения скорости работы для посетителей. Серверная оптимизация позволит выдержать больше посетителей не покупая более дорогие сервера.
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…