Magento code debugging

Post on 11-Nov-2014

2.335 views 0 download

Tags:

description

Magento code debugging by Pavel Novitsky

Transcript of Magento code debugging

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

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

Meet Magento Belarus 2012

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

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

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

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

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

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

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

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

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

кода

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

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

Вывод ошибок

В php.ini:

display_errors = Onerror_reporting = E_ALL | E_STRICT

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

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

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

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

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

echo $myVar;

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

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

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

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

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

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" }

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

debug_backtrace() и print_debug_backtrace()

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

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

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

get_class()

get_class_vars()

get_declared_classes()

method_exists()

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

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

Запросы к БД

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

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

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

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

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

А как же Magento?

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

Вывод ошибок

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

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

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

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

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

print_r($customer);

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

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

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] => john.doe@example.com [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] => john.doe@example.com [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

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

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

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

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

Varien_Object::getData()

Varien_Object::debug()

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

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

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

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

[entity_id] => 1

[entity_type_id] => 1

[attribute_set_id] => 0

[website_id] => 1

[email] => john.doe@example.com

[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

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

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

debug_backtrace()

print_debug_backtrace()

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

Varien_Debug::backtrace()

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

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

get_class()

get_class_vars()

get_declared_classes()

method_exists()

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

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

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

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

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

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

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

$myCollection->load(true);

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

$myCollection->load(false, true);

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

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

$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`

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

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

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

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

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

Что ещё?

Логирование

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

<?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();

// … наш код …

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

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

Установка

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

Настройка

xDebug

Настройка NetBeans IDE

xDebug

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

xDebug

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

easy Xdebug http://bit.ly/LKpvjC

Xdebug helper http://bit.ly/KuCo2c

Профайлинг

xdebug.profiler_enable=1

xDebug

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

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

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

<disable_local_modules>true</disable_local_modules>

<config><modules>

<Some_Module><active>false</active>

<Some_Module></modules>

</config>

Commerce Bug http://bit.ly/M8ggqh

Magento Connect — developer tools

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

Magento Connect — developer tools

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

Magento Connect — developer tools

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

Developer Toolbar http://bit.ly/LnD1Hk

Magento Connect — developer tools

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));

Magento Connect — developer tools

Developer Helper http://bit.ly/OLauwz

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

pavel@belvg.com