Magento code debugging

46
СПОСОБЫ ОТЛАДКИ ПРИ РАЗРАБОТКЕ ПОД MAGENTO Павел Новицкий Meet Magento Belarus 2012

description

Magento code debugging by Pavel Novitsky

Transcript of Magento code debugging

Page 1: Magento code debugging

СПОСОБЫ ОТЛАДКИ ПРИ РАЗРАБОТКЕ ПОД MAGENTO

Павел Новицкий

Meet Magento Belarus 2012

Page 2: Magento code debugging

Отладка кода вдвое сложнее, чем его написание.

Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.

Брайан Керниган

Page 3: Magento code debugging

Magento в первую очередь — это PHP

Page 4: Magento code debugging

Популярные практики при отладке PHP приложений.

1. Вывод ошибок

2. Значения переменной

3. Структурные данные

4. Отслеживание выполнения

кода

5. Исследование объектов

6. Запросы к БД

Page 5: Magento code debugging

Вывод ошибок

В php.ini:

display_errors = Onerror_reporting = E_ALL | E_STRICT

Непосредственно в приложении:

ini_set('display_errors', 'On');error_reporting(E_ALL | E_STRICT);

Вывод ошибокЗначения переменнойСтруктурные данныеОтслеживание выполнения кодаИсследование объектовЗапросы к БД

Популярные практики при отладке PHP приложений.

Page 6: Magento code debugging

Вывод значения переменной

echo $myVar;

Практически бесполезно.

В большинстве случаев — потраченное зря время.

Вывод ошибокЗначения переменнойСтруктурные данныеОтслеживание выполнения кодаИсследование объектовЗапросы к БД

Популярные практики при отладке PHP приложений.

Page 7: Magento code debugging

Вывод структурных данных

var_dump($myArray);echo '<pre>'.print_r($myArray, true).

'</pre>';

Array( [key1] => value 1 [key2] => value 2)

Вывод ошибокЗначения переменнойСтруктурные данныеОтслеживание выполнения кодаИсследование объектовЗапросы к БД

Популярные практики при отладке PHP приложений.

array(2) { ["key1"]=> string(7) "value 1" ["key2"]=> string(7) "value 2" }

Page 8: Magento code debugging

Отслеживание выполнения кода

debug_backtrace() и print_debug_backtrace()

Вывод ошибокЗначения переменнойСтруктурные данныеОтслеживание выполнения кодаИсследование объектовЗапросы к БД

Популярные практики при отладке PHP приложений.

Page 9: Magento code debugging

Что же у нас за объект?

get_class()

get_class_vars()

get_declared_classes()

method_exists()

Вывод ошибокЗначения переменнойСтруктурные данныеОтслеживание выполнения кодаИсследование объектовЗапросы к БД

Популярные практики при отладке PHP приложений.

Page 10: Magento code debugging

Запросы к БД

a) echo $sql = "SELECT `some_field1` FROM `table` WHERE `some_field2` = '$var'";

b) $res = mysql_query($sql) or die(mysql_error());

Вывод ошибокЗначения переменнойСтруктурные данныеОтслеживание выполнения кодаИсследование объектовЗапросы к БД

Популярные практики при отладке PHP приложений.

Page 11: Magento code debugging

Для большинства приложений этого достаточно.

А как же Magento?

Page 12: Magento code debugging

error_reporting(E_ALL | E_STRICT);ini_set('display_errors', 1);

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) { Mage::setIsDeveloperMode(true);}

в .htaccess добавитьSetEnv MAGE_IS_DEVELOPER_MODE “true”

Применение стандартных практик в Magento

Вывод ошибок

Page 13: Magento code debugging

Только для проверки какой-то промежуточной переменной.

Точно также бесполезно.

Применение стандартных практик в Magento

Вывод значения переменной

Page 14: Magento code debugging

$customer = Mage::getModel('customer/customer')->load(1);

print_r($customer);

Применение стандартных практик в Magento

Вывод структурных данных

Page 15: Magento code debugging

Mage_Customer_Model_Customer Object ( [_eventPrefix:protected] => customer [_eventObject:protected] => customer [_errors:protected] =>

Array ( ) [_attributes:protected] => [_addresses:protected] => [_addressesCollection:protected] => [_isDeleteable:protected] => 1 [

_isReadonly:protected] => [_resourceName:protected] => customer/customer [_resource:protected] => [_resourceCollectionName:protected] =>

customer/customer_collection [_cacheTag:protected] => [_dataSaveAllowed:protected] => 1 [_isObjectNew:protected] => [_data:protected] =>

Array ( [entity_id] => 1 [entity_type_id] => 1 [attribute_set_id] => 0 [website_id] => 1 [email] => [email protected] [group_id] => 1 [

increment_id] => 000000001 [store_id] => 1 [created_at] => 2007-08-30 23:23:13 [updated_at] => 2008-08-08 12:28:24 [is_active] => 1 [

firstname] => John [lastname] => Doe [password_hash] => 2049484a4020ed15d0e4238db22977d5:eg [prefix] => [middlename] => [suffix] =>

[taxvat] => [default_billing] => 274 [default_shipping] => 274 ) [_hasDataChanges:protected] => [_origData:protected] => Array ( [entity_id] =>

1 [entity_type_id] => 1 [attribute_set_id] => 0 [website_id] => 1 [email] => [email protected] [group_id] => 1 [increment_id] =>

000000001 [store_id] => 1 [created_at] => 2007-08-30 23:23:13 [updated_at] => 2008-08-08 12:28:24 [is_active] => 1 [firstname] => John

[lastname] => Doe [password_hash] => 2049484a4020ed15d0e4238db22977d5:eg [prefix] => [middlename] => [suffix] => [taxvat] => [

default_billing] => 274 [default_shipping] => 274 ) [_idFieldName:protected] => entity_id [_isDeleted:protected] => [_oldFieldsMap:protected] =>

Array ( ) [_syncFieldsMap:protected] => Array ( ) )

Применение стандартных практик в Magento

Вывод структурных данных

Page 16: Magento code debugging

Применение стандартных практик в Magento

Снова бесполезно?

Page 17: Magento code debugging

Применение стандартных практик в Magento

Varien_Object::getData()

Varien_Object::debug()

Page 18: Magento code debugging

$customer = Mage::getModel('customer/customer')->load(1);

echo '<pre>'.print_r($customer->debug(), true);

Применение стандартных практик в Magento

Вывод структурных данных

Page 19: Magento code debugging

[entity_id] => 1

[entity_type_id] => 1

[attribute_set_id] => 0

[website_id] => 1

[email] => [email protected]

[group_id] => 1

[increment_id] => 000000001

[store_id] => 1

[created_at] => 2007-08-30 23:23:13

[updated_at] => 2008-08-08 12:28:24

[is_active] => 1

[firstname] => John

[lastname] => Doe

[password_hash] => 2049484a4020ed15d0e4238db22977d5:eg

[prefix] =>

[middlename] =>

[suffix] =>

[taxvat] =>

[default_billing] => 274

[default_shipping] => 274

Применение стандартных практик в Magento

Вывод структурных данных

Page 20: Magento code debugging

Отслеживание выполнения кода

debug_backtrace()

print_debug_backtrace()

Применение стандартных практик в Magento

Varien_Debug::backtrace()

Page 21: Magento code debugging

Применение стандартных практик в Magento

Изучение объекта

get_class()

get_class_vars()

get_declared_classes()

method_exists()

Используется повсеместно в Magento

Page 22: Magento code debugging

Запросы к базе данных

echo $sql = "SELECT `some_field1` FROM `table`”;

$res = mysql_query($sql) or die(mysql_error());

Применение стандартных практик в Magento

Page 23: Magento code debugging

Запросы к базе данных

Вывести запрос:

$myCollection->load(true);

Записать запрос в системный лог:

$myCollection->load(false, true);

Применение стандартных практик в Magento

Page 24: Magento code debugging

Запросы к базе данных

$model = Mage::getModel('catalog/product')->getCollection();$sql = $model->getSelect()->__toString();echo $sql;

Применение стандартных практик в Magento

Mage::getModel('catalog/product')->getCollection()->load(true);

SELECT `e`.* FROM `catalog_product_entity` AS `e`

Page 25: Magento code debugging

Запросы к базе данных

Записываем все запросы в var/debug/pdo_mysql.log

Применение стандартных практик в Magento

lib/Varien/Db/Adapter/Pdo/Mysql.php:

protected $_debug = true; protected $_logAllQueries = true;

Page 26: Magento code debugging

Что ещё?

Page 27: Magento code debugging

Логирование

Page 28: Magento code debugging

Экспериментируем

<?php

error_reporting(E_ALL | E_STRICT);ini_set('display_errors', 1);

$mageFilename = 'app/Mage.php';require_once $mageFilename;

Mage::setIsDeveloperMode(true);umask(0);

Mage::app();

// … наш код …

Page 29: Magento code debugging

— швейцарский нож разработчика

ОТЛАДКА и ПРОФАЙЛИНГ

Page 30: Magento code debugging

Установка

xdebug.profiler_enable_trigger=onxdebug.remote_autostart=offxdebug.remote_enable=1xdebug.remote_host="127.0.0.1"xdebug.remote_port=9000xdebug.remote_handler="dbgp"xdebug.idekey="netbeans"xdebug.collect_vars=onxdebug.collect_params=4xdebug.show_local_vars=onxdebug.var_display_max_depth=5xdebug.show_exception_trace=on

zend_extension=/usr/lib/php5/20090626+lfs/xdebug.so

; zend_extension_ts="c:\php\ext\php_xdebug-2.0.1-5.2.1.dll"

xDebug

http://xdebug.org/download.php

Настройка

Page 31: Magento code debugging

xDebug

Настройка NetBeans IDE

Page 32: Magento code debugging

xDebug

И что же нам это даёт?http://example.com/index.php?XDEBUG_SESSION_START=netbeans

Page 33: Magento code debugging

xDebug

http://example.com/index.php?XDEBUG_SESSION_START=netbeans

easy Xdebug http://bit.ly/LKpvjC

Xdebug helper http://bit.ly/KuCo2c

Page 34: Magento code debugging

Профайлинг

xdebug.profiler_enable=1

xDebug

Page 35: Magento code debugging

Визуализация логов

xDebug — профайлинг

Webgrind http://bit.ly/LXMGFJ

Kcachegrind http://bit.ly/KGzyAw

WinCacheGrind http://bit.ly/Nh4iPY

Xdebugtoolkit http://bit.ly/LmB4t9

MacCallGrind http://bit.ly/LlerGS

CachegrindVisualizer http://bit.ly/OD6dLy

Page 36: Magento code debugging

К нам пришёл клиент…

Page 37: Magento code debugging

<disable_local_modules>true</disable_local_modules>

Page 38: Magento code debugging

<config><modules>

<Some_Module><active>false</active>

<Some_Module></modules>

</config>

Page 39: Magento code debugging
Page 40: Magento code debugging

Commerce Bug http://bit.ly/M8ggqh

Magento Connect — developer tools

Page 41: Magento code debugging

Developer Toolbar for Magento http://bit.ly/LnSW8s

Magento Connect — developer tools

Page 42: Magento code debugging

Advanced Developer Tools http://bit.ly/Lo1Vqa

Magento Connect — developer tools

Только для версий ниже 1.6.1

Page 43: Magento code debugging

Developer Toolbar http://bit.ly/LnD1Hk

Magento Connect — developer tools

Page 44: Magento code debugging

Magento FirePHP http://bit.ly/LnYGyX

Magento Connect — developer tools

Mage::helper('firephp')->send('Lorem ipsum sit amet ..');Mage::helper('firephp')->debug(Mage::getModel('catalog/product')->load(54));

Page 45: Magento code debugging

Magento Connect — developer tools

Developer Helper http://bit.ly/OLauwz

Page 46: Magento code debugging

СПАСИБО ЗА ВНИМАНИЕ

[email protected]