magento - Каранда Александр, Кирилл Морозов
DESCRIPTION
Magento. Медосмотр.TRANSCRIPT
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
Спасибо за внимание
Вопросы?