SlideShare ist ein Scribd-Unternehmen logo
1 von 13
Профилирование и оптимизация
фреймворков высоконагруженных систем
            на примере Zend Framework




                         Цехановский Сергей
                                      IT 2.0
Сравнительный анализ производительности
                                         фреймворков



req/s




        Yii                     Cod                     K oh            Zen             Cak        Sym
              Fra                     eI g                  ana             d   Fra        e PH          fon
                    me                       nite                 PH               me          P               y
                      wo                            r               P                 wo
                           rk                                                           rk
Цель профилирования - выловить узкие места


            1. Xdebug

                       Временной отчет о                 Просмотр в
   Xdebug             процессе выполнения           удобочитаемом виде
                           сценариев                  в WinCacheGrind

2. Отлавливание                    3. FirePHP
медленных SQL-запросов
 Логирование SQL запросов на
                                                            Наглядное
       стороне сервера
                                    Интеграция в          отслеживание
                                     ZF с FirePHP         SQL запросов в
                                                              FireFox
            Отчет
Оптимизация: уровень сервера




• Добавление индексов для непроиндексированных полей БД


• Кэширование байт-кода
                            $role = 0;                                           0101001001010010100100101101
                                                                                 0100101010100101001010100101
   1. APC
                            $hasCard= false;
                            $cardAlready = false;                                1010010101101001010010010100
                            $tblUserRoles->delete('UserId = ' . $UserId);        0100101010100101011011010110
                            foreach ($objRoles as $objRole) {                    1010111010111101101100101011
   2. eAccelerator          if (isset($formData[$objRole->RoleId]) &&
                            $formData[$objRole->RoleId]) {
                            if ($objRole->RoleId == 8) $hasCard = true;
                                                                                 0010111111110100101001010100
                                                                                 1010100101010010000001010101
                            if ($objRole->RoleId == 13)$cardAlready = true;      0101101010101001011100101011

   3. xCache                $objUserRole = $tblUserRoles->createRow();
                            $objUserRole->RoleId = $objRole->RoleId;
                            $objUserRole->UserId = $UserId;
                                                                                 0100101010101011111101011010
                                                                                 1110101111011011001010110010
                                                                                 1111111101001010010101001010
                            $objUserRole->CreateDate = date('Y-m-d H:i:s');      1001010100100000010101010101
                            $objUserRole->CreateBy = Zend_Auth::getInstance()-   1010101010010111001010110100
                            >getIdentity()->UserId;
                            $objUserRole->save();                                1010010101101001010101010111
                            $role = $objRole->RoleId;                            1110101101010101111110101101
                            }                                                    111110101101
Оптимизация: уровень сервера
Оптимизация: уровень приложения




 Zend_Cache
                                    ранение кэша в
                                       памяти с
                                     применением
                                      Memcached
. Кэширование структуры таблиц
                                        ранение
. Кэширование информации            кэшированных
                                    фрагментов на
                                  диске в виде файлов
Оптимизация: уровень приложения




Объединение классов
                               lass 1       lass 2       lass n

. Накопительная сборка всех
используемых классов Zend в             lass 1 Class 2
один php-файл
                                            lass 3

. Накопительная сборка всех
классов, наследуемых от ZF в                lass n
один файл
Оптимизация: сборщик классов


                                     spl_autoload_register('__autoload');
               начало($str)          register_shutdown_function('__autoload');


                 $str пустое        нет                      Класс          да


                     ?                                    определён?

                           да                                     нет
                                                                                                конец
                                                     Пробуем инклудить по
Берем список классов ZF, открываем каждый
                                                         имени ($str).
файл и сливаем его содержимое в один файл                                                Пробуем определить

                                                                                           путь к классу по
                                                           Удалось               нет
  Берем список пользовательских классов,                                                       имени
                                                              ?
  открываем каждый файл и сливаем его                             да

                                                                                                                 нет
         содержимое в один файл                    Записываем в очередь на
                                                                                              удалось?
                                                     добавление в список
                                                                                                     да
                  конец                            пользовательских классов
                                                                                       Записываем в очередь на

                                                                                         добавление в список

                                                                                              классов ZF
Оптимизация: файл конфигурации



Zend/Application.php
public function __construct($environment, $options = null)
{
$this->_environment = (string) $environment;
require_once 'Zend/Loader/Autoloader.php';
$this->_autoloader = Zend_Loader_Autoloader::getInstance();
if (null !== $options) {
                  $session = new Zend_Session_Namespace('iniconf');
                  if (!$sessOptions = $session->arrConfig) {
                  if (is_string($options)) {
                  $options = $this->_loadConfig($options);
                  $session->config = $options;
                  Zend_Registry::set('conf', $options);
                  $options=$options->toArray();
                  $session->arrConfig = $options;
               } elseif ($options instanceof Zend_Config) {
               $options = $options->toArray();
               } elseif (!is_array($options)) {
               throw new Zend_Application_Exception('Invalid options provided; must be location of config file, a config object, or an array');
               }
               } else {
               Zend_Registry::set('conf', $session->config);
               $options = $sessOptions;
               }
               $this->setOptions($options); }
}
Оптимизация: инициализация модулей



Zend/Application/Resource/Modules.php ф-ия init()
$uri = $_SERVER['REQUEST_URI'];

$ar = explode('/', $uri);
$mdl = (''!=$ar[1]) ? $ar[1]:'default';

foreach ($modules as $module => $moduleDirectory) {
if ($mdl == $module) {
                                                      одуль 1   одуль 2   одуль n
…………………………………………
}                                                                ласс
}




                                                      одуль 1   одуль 2   одуль n
                                                                 ласс
Оптимизация: генерация пути



ZendControllerActionHelperViewRenderer.php, initView
if (empty($path)) {
$uri = $_SERVER['REQUEST_URI'];
$ar = explode('/', $uri);
$mdl = (''!=$ar[1]) ? $ar[1]:'default';

$path = APPLICATION_PATH . '/modules/' . $mdl . '/views';

//$path = $this->_getBasePath(); - тяжелая ф-ия,
if (empty($path)) {
require_once 'Zend/Controller/Action/Exception.php';
                   throw new
Zend_Controller_Action_Exception('ViewRenderer initialization
failed: retrieved view base path is empty');
                   }
}
Результаты оптимизации




      Исходный проект 48 r/s



Включение eAccelerator 57 r/s



 Объединение классов 85 r/s



   Ручная оптимизация 98 r/s
Спасибо за внимание!

Weitere ähnliche Inhalte

Was ist angesagt?

Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?yiiconf
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоAlexander Makarov
 
Работа с полями (fields) в Drupal 7
Работа с полями (fields) в Drupal 7Работа с полями (fields) в Drupal 7
Работа с полями (fields) в Drupal 7Eugene Fidelin
 
Работа с материалами (nodes) в Drupal 7
Работа с материалами (nodes) в Drupal 7Работа с материалами (nodes) в Drupal 7
Работа с материалами (nodes) в Drupal 7Eugene Fidelin
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseCocoaHeads
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9Technopark
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьAndrey Bibichev
 
Web осень 2012 лекция 9
Web осень 2012 лекция 9Web осень 2012 лекция 9
Web осень 2012 лекция 9Technopark
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»e-Legion
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DAndreyGeonya
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Yandex
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Pavel Novitsky
 
AddConf. Дмитрий Сошников - Будущее ECMAScript
AddConf. Дмитрий Сошников  - Будущее ECMAScriptAddConf. Дмитрий Сошников  - Будущее ECMAScript
AddConf. Дмитрий Сошников - Будущее ECMAScriptDmitry Soshnikov
 
Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Magecom Ukraine
 

Was ist angesagt? (20)

Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что нового
 
Работа с полями (fields) в Drupal 7
Работа с полями (fields) в Drupal 7Работа с полями (fields) в Drupal 7
Работа с полями (fields) в Drupal 7
 
Работа с материалами (nodes) в Drupal 7
Работа с материалами (nodes) в Drupal 7Работа с материалами (nodes) в Drupal 7
Работа с материалами (nodes) в Drupal 7
 
Лекция #7. Django ORM
Лекция #7. Django ORMЛекция #7. Django ORM
Лекция #7. Django ORM
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
Web осень 2012 лекция 9
Web осень 2012 лекция 9Web осень 2012 лекция 9
Web осень 2012 лекция 9
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»
 
Javascript
JavascriptJavascript
Javascript
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
 
JDBC
JDBCJDBC
JDBC
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
 
AddConf. Дмитрий Сошников - Будущее ECMAScript
AddConf. Дмитрий Сошников  - Будущее ECMAScriptAddConf. Дмитрий Сошников  - Будущее ECMAScript
AddConf. Дмитрий Сошников - Будущее ECMAScript
 
Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP
 

Andere mochten auch

Promotion of product worldwide - first steps
Promotion of product worldwide - first stepsPromotion of product worldwide - first steps
Promotion of product worldwide - first stepsMageCloud
 
Sieena - Case Study - Psycowin
Sieena - Case Study - PsycowinSieena - Case Study - Psycowin
Sieena - Case Study - PsycowinDefinity First
 
Интернет технологии для бизнеса.
Интернет технологии для бизнеса.Интернет технологии для бизнеса.
Интернет технологии для бизнеса.MageCloud
 
Где находится мобайл и куда он идет в следующие 2-3 года
Где находится мобайл и куда он идет в следующие 2-3 годаГде находится мобайл и куда он идет в следующие 2-3 года
Где находится мобайл и куда он идет в следующие 2-3 годаMageCloud
 
Creative Design by Sieena - www.sieena.com
Creative Design by Sieena - www.sieena.comCreative Design by Sieena - www.sieena.com
Creative Design by Sieena - www.sieena.comDefinity First
 
Коммерческая фотография и продажи
Коммерческая фотография и продажиКоммерческая фотография и продажи
Коммерческая фотография и продажиMageCloud
 

Andere mochten auch (9)

Promotion of product worldwide - first steps
Promotion of product worldwide - first stepsPromotion of product worldwide - first steps
Promotion of product worldwide - first steps
 
Sieena - Case Study - Psycowin
Sieena - Case Study - PsycowinSieena - Case Study - Psycowin
Sieena - Case Study - Psycowin
 
Интернет технологии для бизнеса.
Интернет технологии для бизнеса.Интернет технологии для бизнеса.
Интернет технологии для бизнеса.
 
Gary\'s SketchUp
Gary\'s SketchUpGary\'s SketchUp
Gary\'s SketchUp
 
Где находится мобайл и куда он идет в следующие 2-3 года
Где находится мобайл и куда он идет в следующие 2-3 годаГде находится мобайл и куда он идет в следующие 2-3 года
Где находится мобайл и куда он идет в следующие 2-3 года
 
Test
TestTest
Test
 
Creative Design by Sieena - www.sieena.com
Creative Design by Sieena - www.sieena.comCreative Design by Sieena - www.sieena.com
Creative Design by Sieena - www.sieena.com
 
Коммерческая фотография и продажи
Коммерческая фотография и продажиКоммерческая фотография и продажи
Коммерческая фотография и продажи
 
Agile
AgileAgile
Agile
 

Ähnlich wie Профилирование и оптимизация фреймворков высоконагруженных систем на примере Zend Framework

Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПKirill Chebunin
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Paul Klimov
 
LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)Sergey Skvortsov
 
Symfony(keremet research)
Symfony(keremet research)Symfony(keremet research)
Symfony(keremet research)Alex Polorotov
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПzfconfua
 
Продвинутое использование Celery
Продвинутое использование CeleryПродвинутое использование Celery
Продвинутое использование CeleryAlexander Koshelev
 
Drupal 7 deploy database updates
Drupal 7 deploy database updatesDrupal 7 deploy database updates
Drupal 7 deploy database updatesAnton Ivanov
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
Продвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевПродвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевYandex
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 

Ähnlich wie Профилирование и оптимизация фреймворков высоконагруженных систем на примере Zend Framework (20)

Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
DBIx::Class
DBIx::ClassDBIx::Class
DBIx::Class
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
 
DBIx Class
DBIx ClassDBIx Class
DBIx Class
 
LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)
 
Symfony(keremet research)
Symfony(keremet research)Symfony(keremet research)
Symfony(keremet research)
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Продвинутое использование Celery
Продвинутое использование CeleryПродвинутое использование Celery
Продвинутое использование Celery
 
бегун
бегунбегун
бегун
 
Drupal 7 deploy database updates
Drupal 7 deploy database updatesDrupal 7 deploy database updates
Drupal 7 deploy database updates
 
Backbone js
Backbone jsBackbone js
Backbone js
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Продвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевПродвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр Кошелев
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
Zend framework 2
Zend framework 2Zend framework 2
Zend framework 2
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 

Mehr von MageCloud

How to find the Right Mobile and Cloud Application Development Company for Yo...
How to find the Right Mobile and Cloud Application Development Company for Yo...How to find the Right Mobile and Cloud Application Development Company for Yo...
How to find the Right Mobile and Cloud Application Development Company for Yo...MageCloud
 
First Steps to Mobile Sites and Apps
First Steps to Mobile Sites and AppsFirst Steps to Mobile Sites and Apps
First Steps to Mobile Sites and AppsMageCloud
 
Optimizing Magento for Peak Performance
Optimizing Magento for Peak PerformanceOptimizing Magento for Peak Performance
Optimizing Magento for Peak PerformanceMageCloud
 
Cloud Based Business Application Development
Cloud Based Business Application DevelopmentCloud Based Business Application Development
Cloud Based Business Application DevelopmentMageCloud
 
Three keys to successful banner ads
Three keys to successful banner adsThree keys to successful banner ads
Three keys to successful banner adsMageCloud
 
Two Facets of Great e-Commerce: PPC and Landing Page Best Practices
Two Facets of Great e-Commerce: PPC and Landing Page Best PracticesTwo Facets of Great e-Commerce: PPC and Landing Page Best Practices
Two Facets of Great e-Commerce: PPC and Landing Page Best PracticesMageCloud
 
Security testing
Security testingSecurity testing
Security testingMageCloud
 
Project lifecircle
Project lifecircleProject lifecircle
Project lifecircleMageCloud
 
Management of projects
Management of projectsManagement of projects
Management of projectsMageCloud
 
Magento ecommerce
Magento ecommerceMagento ecommerce
Magento ecommerceMageCloud
 
Dotnet development
Dotnet developmentDotnet development
Dotnet developmentMageCloud
 
Corporate structure project_team
Corporate structure project_teamCorporate structure project_team
Corporate structure project_teamMageCloud
 
Continuous integration
Continuous integrationContinuous integration
Continuous integrationMageCloud
 
Clientside optimization
Clientside optimizationClientside optimization
Clientside optimizationMageCloud
 
Automated testing
Automated testingAutomated testing
Automated testingMageCloud
 
Хороший дизайн = продажи
Хороший дизайн = продажиХороший дизайн = продажи
Хороший дизайн = продажиMageCloud
 

Mehr von MageCloud (20)

How to find the Right Mobile and Cloud Application Development Company for Yo...
How to find the Right Mobile and Cloud Application Development Company for Yo...How to find the Right Mobile and Cloud Application Development Company for Yo...
How to find the Right Mobile and Cloud Application Development Company for Yo...
 
First Steps to Mobile Sites and Apps
First Steps to Mobile Sites and AppsFirst Steps to Mobile Sites and Apps
First Steps to Mobile Sites and Apps
 
Optimizing Magento for Peak Performance
Optimizing Magento for Peak PerformanceOptimizing Magento for Peak Performance
Optimizing Magento for Peak Performance
 
Cloud Based Business Application Development
Cloud Based Business Application DevelopmentCloud Based Business Application Development
Cloud Based Business Application Development
 
Three keys to successful banner ads
Three keys to successful banner adsThree keys to successful banner ads
Three keys to successful banner ads
 
Two Facets of Great e-Commerce: PPC and Landing Page Best Practices
Two Facets of Great e-Commerce: PPC and Landing Page Best PracticesTwo Facets of Great e-Commerce: PPC and Landing Page Best Practices
Two Facets of Great e-Commerce: PPC and Landing Page Best Practices
 
Testing
TestingTesting
Testing
 
Security testing
Security testingSecurity testing
Security testing
 
Project lifecircle
Project lifecircleProject lifecircle
Project lifecircle
 
Management of projects
Management of projectsManagement of projects
Management of projects
 
Magento ecommerce
Magento ecommerceMagento ecommerce
Magento ecommerce
 
Graphics
GraphicsGraphics
Graphics
 
Dotnet development
Dotnet developmentDotnet development
Dotnet development
 
Corporate structure project_team
Corporate structure project_teamCorporate structure project_team
Corporate structure project_team
 
Continuous integration
Continuous integrationContinuous integration
Continuous integration
 
Clientside optimization
Clientside optimizationClientside optimization
Clientside optimization
 
Automated testing
Automated testingAutomated testing
Automated testing
 
Amazon
AmazonAmazon
Amazon
 
Webdesign
WebdesignWebdesign
Webdesign
 
Хороший дизайн = продажи
Хороший дизайн = продажиХороший дизайн = продажи
Хороший дизайн = продажи
 

Профилирование и оптимизация фреймворков высоконагруженных систем на примере Zend Framework

  • 1. Профилирование и оптимизация фреймворков высоконагруженных систем на примере Zend Framework Цехановский Сергей IT 2.0
  • 2. Сравнительный анализ производительности фреймворков req/s Yii Cod K oh Zen Cak Sym Fra eI g ana d Fra e PH fon me nite PH me P y wo r P wo rk rk
  • 3. Цель профилирования - выловить узкие места 1. Xdebug Временной отчет о Просмотр в Xdebug процессе выполнения удобочитаемом виде сценариев в WinCacheGrind 2. Отлавливание 3. FirePHP медленных SQL-запросов Логирование SQL запросов на Наглядное стороне сервера Интеграция в отслеживание ZF с FirePHP SQL запросов в FireFox Отчет
  • 4. Оптимизация: уровень сервера • Добавление индексов для непроиндексированных полей БД • Кэширование байт-кода $role = 0; 0101001001010010100100101101 0100101010100101001010100101 1. APC $hasCard= false; $cardAlready = false; 1010010101101001010010010100 $tblUserRoles->delete('UserId = ' . $UserId); 0100101010100101011011010110 foreach ($objRoles as $objRole) { 1010111010111101101100101011 2. eAccelerator if (isset($formData[$objRole->RoleId]) && $formData[$objRole->RoleId]) { if ($objRole->RoleId == 8) $hasCard = true; 0010111111110100101001010100 1010100101010010000001010101 if ($objRole->RoleId == 13)$cardAlready = true; 0101101010101001011100101011 3. xCache $objUserRole = $tblUserRoles->createRow(); $objUserRole->RoleId = $objRole->RoleId; $objUserRole->UserId = $UserId; 0100101010101011111101011010 1110101111011011001010110010 1111111101001010010101001010 $objUserRole->CreateDate = date('Y-m-d H:i:s'); 1001010100100000010101010101 $objUserRole->CreateBy = Zend_Auth::getInstance()- 1010101010010111001010110100 >getIdentity()->UserId; $objUserRole->save(); 1010010101101001010101010111 $role = $objRole->RoleId; 1110101101010101111110101101 } 111110101101
  • 6. Оптимизация: уровень приложения Zend_Cache ранение кэша в памяти с применением Memcached . Кэширование структуры таблиц ранение . Кэширование информации кэшированных фрагментов на диске в виде файлов
  • 7. Оптимизация: уровень приложения Объединение классов lass 1 lass 2 lass n . Накопительная сборка всех используемых классов Zend в lass 1 Class 2 один php-файл lass 3 . Накопительная сборка всех классов, наследуемых от ZF в lass n один файл
  • 8. Оптимизация: сборщик классов spl_autoload_register('__autoload'); начало($str) register_shutdown_function('__autoload'); $str пустое нет Класс да ? определён? да нет конец Пробуем инклудить по Берем список классов ZF, открываем каждый имени ($str). файл и сливаем его содержимое в один файл Пробуем определить путь к классу по Удалось нет Берем список пользовательских классов, имени ? открываем каждый файл и сливаем его да нет содержимое в один файл Записываем в очередь на удалось? добавление в список да конец пользовательских классов Записываем в очередь на добавление в список классов ZF
  • 9. Оптимизация: файл конфигурации Zend/Application.php public function __construct($environment, $options = null) { $this->_environment = (string) $environment; require_once 'Zend/Loader/Autoloader.php'; $this->_autoloader = Zend_Loader_Autoloader::getInstance(); if (null !== $options) { $session = new Zend_Session_Namespace('iniconf'); if (!$sessOptions = $session->arrConfig) { if (is_string($options)) { $options = $this->_loadConfig($options); $session->config = $options; Zend_Registry::set('conf', $options); $options=$options->toArray(); $session->arrConfig = $options; } elseif ($options instanceof Zend_Config) { $options = $options->toArray(); } elseif (!is_array($options)) { throw new Zend_Application_Exception('Invalid options provided; must be location of config file, a config object, or an array'); } } else { Zend_Registry::set('conf', $session->config); $options = $sessOptions; } $this->setOptions($options); } }
  • 10. Оптимизация: инициализация модулей Zend/Application/Resource/Modules.php ф-ия init() $uri = $_SERVER['REQUEST_URI']; $ar = explode('/', $uri); $mdl = (''!=$ar[1]) ? $ar[1]:'default'; foreach ($modules as $module => $moduleDirectory) { if ($mdl == $module) { одуль 1 одуль 2 одуль n ………………………………………… } ласс } одуль 1 одуль 2 одуль n ласс
  • 11. Оптимизация: генерация пути ZendControllerActionHelperViewRenderer.php, initView if (empty($path)) { $uri = $_SERVER['REQUEST_URI']; $ar = explode('/', $uri); $mdl = (''!=$ar[1]) ? $ar[1]:'default'; $path = APPLICATION_PATH . '/modules/' . $mdl . '/views'; //$path = $this->_getBasePath(); - тяжелая ф-ия, if (empty($path)) { require_once 'Zend/Controller/Action/Exception.php'; throw new Zend_Controller_Action_Exception('ViewRenderer initialization failed: retrieved view base path is empty'); } }
  • 12. Результаты оптимизации Исходный проект 48 r/s Включение eAccelerator 57 r/s Объединение классов 85 r/s Ручная оптимизация 98 r/s