meet magento belarus debug pavel novitsky (rus)

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

Upload: pavel-novitsky

Post on 15-Jun-2015

710 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Meet Magento Belarus debug Pavel Novitsky (rus)

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

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

Meet Magento Belarus 2012

Page 2: Meet Magento Belarus debug Pavel Novitsky (rus)

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

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

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

Page 3: Meet Magento Belarus debug Pavel Novitsky (rus)

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

Page 4: Meet Magento Belarus debug Pavel Novitsky (rus)

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

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

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

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

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

кода

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

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

Page 5: Meet Magento Belarus debug Pavel Novitsky (rus)

Вывод ошибок

В php.ini:

display_errors = Onerror_reporting = E_ALL | E_STRICT

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

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

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

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

Page 6: Meet Magento Belarus debug Pavel Novitsky (rus)

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

echo $myVar;

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

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

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

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

Page 7: Meet Magento Belarus debug Pavel Novitsky (rus)

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

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: Meet Magento Belarus debug Pavel Novitsky (rus)

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

debug_backtrace() и print_debug_backtrace()

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

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

Page 9: Meet Magento Belarus debug Pavel Novitsky (rus)

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

get_class()

get_class_vars()

get_declared_classes()

method_exists()

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

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

Page 10: Meet Magento Belarus debug Pavel Novitsky (rus)

Запросы к БД

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

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

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

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

Page 11: Meet Magento Belarus debug Pavel Novitsky (rus)

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

А как же Magento?

Page 12: Meet Magento Belarus debug Pavel Novitsky (rus)

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: Meet Magento Belarus debug Pavel Novitsky (rus)

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

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

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

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

Page 14: Meet Magento Belarus debug Pavel Novitsky (rus)

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

print_r($customer);

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

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

Page 15: Meet Magento Belarus debug Pavel Novitsky (rus)

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: Meet Magento Belarus debug Pavel Novitsky (rus)

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

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

Page 17: Meet Magento Belarus debug Pavel Novitsky (rus)

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

Varien_Object::getData()

Varien_Object::debug()

Page 18: Meet Magento Belarus debug Pavel Novitsky (rus)

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

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

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

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

Page 19: Meet Magento Belarus debug Pavel Novitsky (rus)

[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: Meet Magento Belarus debug Pavel Novitsky (rus)

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

debug_backtrace()

print_debug_backtrace()

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

Varien_Debug::backtrace()

Page 21: Meet Magento Belarus debug Pavel Novitsky (rus)

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

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

get_class()

get_class_vars()

get_declared_classes()

method_exists()

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

Page 22: Meet Magento Belarus debug Pavel Novitsky (rus)

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

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

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

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

Page 23: Meet Magento Belarus debug Pavel Novitsky (rus)

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

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

$myCollection->load(true);

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

$myCollection->load(false, true);

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

Page 24: Meet Magento Belarus debug Pavel Novitsky (rus)

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

$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: Meet Magento Belarus debug Pavel Novitsky (rus)

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

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

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

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

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

Page 26: Meet Magento Belarus debug Pavel Novitsky (rus)

Что ещё?

Page 27: Meet Magento Belarus debug Pavel Novitsky (rus)

Логирование

Page 28: Meet Magento Belarus debug Pavel Novitsky (rus)

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

<?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: Meet Magento Belarus debug Pavel Novitsky (rus)

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

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

Page 30: Meet Magento Belarus debug Pavel Novitsky (rus)

Установка

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: Meet Magento Belarus debug Pavel Novitsky (rus)

xDebug

Настройка NetBeans IDE

Page 32: Meet Magento Belarus debug Pavel Novitsky (rus)

xDebug

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

Page 33: Meet Magento Belarus debug Pavel Novitsky (rus)

xDebug

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

easy Xdebug http://bit.ly/LKpvjC

Xdebug helper http://bit.ly/KuCo2c

Page 34: Meet Magento Belarus debug Pavel Novitsky (rus)

Профайлинг

xdebug.profiler_enable=1

xDebug

Page 35: Meet Magento Belarus debug Pavel Novitsky (rus)

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

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: Meet Magento Belarus debug Pavel Novitsky (rus)

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

Page 37: Meet Magento Belarus debug Pavel Novitsky (rus)

<disable_local_modules>true</disable_local_modules>

Page 38: Meet Magento Belarus debug Pavel Novitsky (rus)

<config><modules>

<Some_Module><active>false</active>

<Some_Module></modules>

</config>

Page 39: Meet Magento Belarus debug Pavel Novitsky (rus)
Page 40: Meet Magento Belarus debug Pavel Novitsky (rus)

Commerce Bug http://bit.ly/M8ggqh

Magento Connect — developer tools

Page 41: Meet Magento Belarus debug Pavel Novitsky (rus)

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

Magento Connect — developer tools

Page 42: Meet Magento Belarus debug Pavel Novitsky (rus)

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

Magento Connect — developer tools

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

Page 43: Meet Magento Belarus debug Pavel Novitsky (rus)

Developer Toolbar http://bit.ly/LnD1Hk

Magento Connect — developer tools

Page 44: Meet Magento Belarus debug Pavel Novitsky (rus)

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: Meet Magento Belarus debug Pavel Novitsky (rus)

Magento Connect — developer tools

Developer Helper http://bit.ly/OLauwz

Page 46: Meet Magento Belarus debug Pavel Novitsky (rus)

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

[email protected]