Magento - Каранда Александр, Кирилл Морозов

Post on 24-Jun-2015

1.352 views 0 download

Tags:

description

Magento. Медосмотр.

Transcript of Magento - Каранда Александр, Кирилл Морозов

Magentocommerce.com

«Magento Health Check»

(медосмотр)

Каранда Александр, Кирилл Морозов

О нас

Каранда Александр, консультант

Кирилл Морозов, консультант

А поговорить?

Пролог Теория заболеваний Диагностика Выписываем рецепт

Пролог

Пролог

Ребята, нужно поработать, а не как обычно!

Во что превратилось

Health Check

Upgrade Analysis

Takeoff Check

Business Requirements Analysis

Теория заболеваний Мадженто

84%

16%

I

II

III

IV

V

Температура

37%

21%

13%

8%

5%

16%

Температура

1. Загрузка моделей в цикле

37%

21%

13%

8%

5%

16%

Температура

2. Загрузка одних и тех же сущностей больше одного раза

37%

21%

13%

8%

5%

16%

Температура

3. Обрабатываем больше данных чем нужно

37%

21%

13%

8%

5%

16%

Температура

4. Пересчет данных каждый раз при вызове метода

37%

21%

13%

8%

5%

16%

Температура

5. Забываем о кешировании

37%

21%

13%

8%

5%

16%

Температура

16%

I

II

III

IV

V

Все остальное

Первые симптомы

• Спагетти код

• Копи-паста код

• Хардкорд

• Игнорирование код стилей (Zend)

• Отсутствие PHP-DOC-oв

• Использование голобалсов

• Закоментированые куски кода

• Методы по 200 строк

• Классы по 100500 строк REFACTORING

Запах

Запах

FIXME

TODO

HACK

Запах

Axe Effect

//@todo: fix this bull shit

//@todo: possible PCI compliance issue

//@todo: prepare header from revu format

//@todo: We need to log such exceptions to somewhere

//@todo: remove wish list observer processAddToCart

//@todo: add filter by current website

//@todo: add full name logic

//@todo: move to config

//@todo: implement setter for this value

//@FIXME: stupid fix of previous multi-roles logic.

//@todo: implement

//@todo: merge with reason

//@todo: fix possible issues with date format

Запах

Проблема

Решение

Тренды

• Популярные проблемы • Проблемы по модулям• Классификация проблем

Диагностика

Реальный клиент Х

15+

Неймспесов

120+

Модулей

2000+

Моделей

100000+

Строчек Кода

1000+

Чашек кофе

Реальный клиент Х

Автоматизация

ПХП Шторм плагин:reVu by Sylvain Francois

Автоматизация: PHP CodeSnifferPHP Parser

Автогенерация отчетовphpdocx

Программный граф

1. Файловая Система

Программный граф

1. Файловая Система2. PHP Токенизация

(TokenReflection)Token Type Token Content

T_VARIABLE $a

T_EQUAL =

T_LNUMBER 5

T_SEMICOLON ;

T_VARIABLE $c

T_EQUAL =

T_VARIABLE $a

T_PLUS +

T_LNUMBER 6

$a = 5;$c = $a + 6;

Программный граф

1. Файловая Система2. PHP Токенизация

(TokenReflection)

[code] => 320[type] => T_FOR[content] => for[line] => 3[parenthesis_opener] => 3[parenthesis_closer] => 16[parenthesis_owner] => 2[scope_condition] => 2[scope_opener] => 18[scope_closer] => 26[column] => 1

[23] => Array( [type] => T_VARIABLE [content] => $i [line] => 3 [nested_parenthesis] => Array (          [3] => 16     )

for($i=0; $i < 5; $i++) {   echo $i;}

Программный граф

1. Файловая Система2. PHP Токенизация

(TokenReflection)Поиски Мифического GOTO в коде

Программный граф

1. Файловая Система2. PHP Токенизация

(TokenReflection) Поиски конкатенации строк через +

Программный граф

1. Файловая Система2. PHP Токенизация (TokenReflection)3. PHP Лексическое Дерево

(PHP_Parser)

$a = 1;$b = 2;$c = $a + $b;

Программный граф

1. Файловая Система2. PHP Токенизация (TokenReflection)3. PHP Лексическое Дерево

(PHP_Parser)

xpath : > //node:Expr_MethodCall/subNode:name[ scalar:string="getFirstItem" and count( ./ancestor::node:Expr_MethodCall[1]/descendant::node:Expr_MethodCall/subNode:name[ scalar:string = "limit" or scalar:string = "setPageSize" or scalar:string = "setPage"]) = 0 ] Загрузка коллекций без ограничений

Сравнение подходов

PHP Токенизация (TokenReflection)class Ecg_Sniffs_Performance_LoopModelLoadSniff implements PHP_CodeSniffer_Sniff{ public function register() { return array(T_WHILE, T_FOR, T_FOREACH, T_DO); }

public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) { $tokens = $phpcsFile->getTokens(); $opener = $tokens[$stackPtr]['scope_opener']; $closer = $tokens[$stackPtr]['scope_closer']; for ($ptr = $opener + 1; $ptr < $closer; $ptr++) { $content = $tokens[$ptr]['content']; if ($tokens[$ptr]['code'] === T_STRING && $content == 'load') { $phpcsFile->addError('Model load in loop detected', $ptr, 'ModelLoad', array $content)); } } }}

>> execution time: 0.05sec

PHP Лексическое Дерево//*[ name()="node:Stmt_Foreach" or name()="node:Stmt_Do" or name()="node:Stmt_For" or name()="node:Stmt_While"]//node:Expr_MethodCall/subNode:name[ scalar:string = "load"]

>>execution time: 0.0001sec

Загрузка моделей в цикле

что не нужно забывать

Xml files (configuration & layout updates)

DB Schema (indexes, non-optimal field types)

Javascript, CSS & HTML

Вне поля зрения

Автоматизация находит только подозрения20-25 % подозрений – это круто

Программный граф

1. Файловая Система2. PHP Токенизация (TokenReflection)3. PHP Лексическое Дерево

(PHP_Parser)4. Семантические связи5. Циклические вызовы

Мониторинг

Мониторинг

Что за $%?

Релиз, $%#%!

Мониторинг: Процессор

Мониторинг: Сеть

Мониторинг: Время ответа

Мониторинг: Время ответа

Мониторинг: Самые медленные

Мониторинг: Самые медленные

Мониторинг: Самые медленные

Мониторинг: Самые медленные

APDEX

APDEX

По следам

По следам: Мы знаем как

По следам: Видно почему

По следам: Видно почему

По следам: Кто виноват

По следам: Кто виноват

Выписываем рецепт

Рецепт

• Проверка кода как часть методологии

ведения проектов

• Автоматические проверки кода с

билдами (CI)

• Расширяем базу для проверки(свои

сниферы)

• Пользуемся Системами Мониторинга

(Ньюрелик)

• Систематическая проверка

Просто так

• Скучные вещи не всегда такие скучные• Не все можно автоматизировать• Не ждите пока проблемы начнут проявляться,

проверяйте приложение чаще

Полезности

ECG page

http://magento.com/consulting

Magento coding standards and best practices

https://github.com/magento-ecg/coding-standard

http://www.magentocommerce.com/knowledge-base

https://wiki.magento.com/display/MAGE2DOC/PHP+Coding+Standards+and+Practices

Tools

https://github.com/nikic/PHP-Parser

http://phpmd.org

https://github.com/Andrewsville/PHP-Token-Reflection

Common Weakness Enumeration

http://cwe.mitre.org

reVu code review plugin

https://github.com/syllant/idea-plugin-revu

Спрашивайте

Каранда Александрalex.karanda@ebay.com

Кирилл Морозовkirill.morozov@ebay.com

Спасибо за внимание

Вопросы?