SlideShare a Scribd company logo
1 of 46
СПОСОБЫ ОТЛАДКИ
ПРИ РАЗРАБОТКЕ ПОД MAGENTO


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


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

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

Брайан Керниган
Magento в первую очередь — это PHP
Популярные практики при отладке PHP приложений.




                   1. Вывод ошибок
                   2. Значения переменной
                   3. Структурные данные
                   4. Отслеживание выполнения кода
                   5. Исследование объектов
                   6. Запросы к БД
Популярные практики при отладке PHP приложений.

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



                                Вывод ошибок

   Непосредственно в приложении:         В php.ini:

   ini_set('display_errors', 'On');      display_errors = On
   error_reporting(E_ALL | E_STRICT);    error_reporting = E_ALL | E_STRICT
Популярные практики при отладке PHP приложений.

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



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


                                     echo $myVar;

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

                   В большинстве случаев — потраченное зря время.
Популярные практики при отладке PHP приложений.

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



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


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



   Array
   (                                         array(2) { ["key1"]=> string(7) "value 1" ["key2"]=>
     [key1] => value 1                       string(7) "value 2" }
     [key2] => value 2
   )
Популярные практики при отладке PHP приложений.

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




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


                     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());
Для большинства приложений этого достаточно.


             А как же Magento?
Применение стандартных практик в 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




                                           Varien_Object::getData()


                                           Varien_Object::debug()
Применение стандартных практик в Magento




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



          $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()
                                           Varien_Debug::backtrace()
      print_debug_backtrace()
Применение стандартных практик в Magento




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

                             get_class()

                             get_class_vars()

                             get_declared_classes()

                             method_exists()



                   Используется повсеместно в Magento
Применение стандартных практик в 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



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

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




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




             SELECT `e`.* FROM `catalog_product_entity` AS `e`
Применение стандартных практик в Magento



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

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




                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


                 Установка
         http://xdebug.org/download.php


                 Настройка
         xdebug.profiler_enable_trigger=on
         xdebug.remote_autostart=off
         xdebug.remote_enable=1
         xdebug.remote_host="127.0.0.1"
         xdebug.remote_port=9000
         xdebug.remote_handler="dbgp"
         xdebug.idekey="netbeans"
         xdebug.collect_vars=on
         xdebug.collect_params=4
         xdebug.show_local_vars=on
         xdebug.var_display_max_depth=5
         xdebug.show_exception_trace=on

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

         ; zend_extension_ts="c:phpextphp_xdebug-2.0.1-5.2.1.dll"
xDebug


         Настройка NetBeans IDE
xDebug


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




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




                      Xdebug helper http://bit.ly/KuCo2c




                      easy Xdebug http://bit.ly/LKpvjC
xDebug




          Профайлинг



         xdebug.profiler_enable=1
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>
Magento Connect — developer tools



         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




                            Только для версий ниже 1.6.1
Magento Connect — developer tools




             Developer Toolbar http://bit.ly/LnD1Hk
Magento Connect — developer tools



                          Magento FirePHP http://bit.ly/LnYGyX

       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

More Related Content

What's hot

Yii development
Yii developmentYii development
Yii developmentMageCloud
 
Написание DSL в Perl
Написание DSL в PerlНаписание DSL в Perl
Написание DSL в Perlmayperl
 
Yii2
Yii2Yii2
Yii2Noveo
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассовAndrey Zakharevich
 
Web осень 2013 лекция 4
Web осень 2013 лекция 4Web осень 2013 лекция 4
Web осень 2013 лекция 4Technopark
 
В помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кодаВ помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кодаAndrey Karpov
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.DrupalCampDN
 
Web осень 2013 лекция 7
Web осень 2013 лекция 7Web осень 2013 лекция 7
Web осень 2013 лекция 7Technopark
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвMail.ru Group
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8Technopark
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
Выжить с помощью ООП. Максим Гопей
Выжить с помощью ООП. Максим ГопейВыжить с помощью ООП. Максим Гопей
Выжить с помощью ООП. Максим ГопейEatDog
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 

What's hot (20)

Dependency injection, phemto
Dependency injection, phemtoDependency injection, phemto
Dependency injection, phemto
 
Yii development
Yii developmentYii development
Yii development
 
Написание DSL в Perl
Написание DSL в PerlНаписание DSL в Perl
Написание DSL в Perl
 
Yii2
Yii2Yii2
Yii2
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
Web осень 2013 лекция 4
Web осень 2013 лекция 4Web осень 2013 лекция 4
Web осень 2013 лекция 4
 
В помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кодаВ помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кода
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Javascript
JavascriptJavascript
Javascript
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
 
Web осень 2013 лекция 7
Web осень 2013 лекция 7Web осень 2013 лекция 7
Web осень 2013 лекция 7
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий Копачёв
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
Survive with OOP
Survive with OOPSurvive with OOP
Survive with OOP
 
Выжить с помощью ООП. Максим Гопей
Выжить с помощью ООП. Максим ГопейВыжить с помощью ООП. Максим Гопей
Выжить с помощью ООП. Максим Гопей
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 

Viewers also liked

Magento performance
Magento performanceMagento performance
Magento performanceaheadWorks
 
Пять кейсов из практики aheadWorks с прологом и эпилогом
Пять кейсов из практики aheadWorks с прологом и эпилогомПять кейсов из практики aheadWorks с прологом и эпилогом
Пять кейсов из практики aheadWorks с прологом и эпилогомaheadWorks
 
Guiding rules for choosing a reliable Magento development partner
Guiding rules for choosing a reliable Magento development partnerGuiding rules for choosing a reliable Magento development partner
Guiding rules for choosing a reliable Magento development partneraheadWorks
 
Developing trusted Magento extension
Developing trusted Magento extension Developing trusted Magento extension
Developing trusted Magento extension aheadWorks
 
Magento integration
Magento integrationMagento integration
Magento integrationaheadWorks
 
Moving from Projects to Products: How Newcomers Can Do as Good as Veterans of...
Moving from Projects to Products: How Newcomers Can Do as Good as Veterans of...Moving from Projects to Products: How Newcomers Can Do as Good as Veterans of...
Moving from Projects to Products: How Newcomers Can Do as Good as Veterans of...aheadWorks
 
Writing extensions for Xcommerce
Writing extensions for XcommerceWriting extensions for Xcommerce
Writing extensions for XcommerceaheadWorks
 
Top 10 problems supporting Magento customers
Top 10 problems supporting Magento customersTop 10 problems supporting Magento customers
Top 10 problems supporting Magento customersaheadWorks
 

Viewers also liked (8)

Magento performance
Magento performanceMagento performance
Magento performance
 
Пять кейсов из практики aheadWorks с прологом и эпилогом
Пять кейсов из практики aheadWorks с прологом и эпилогомПять кейсов из практики aheadWorks с прологом и эпилогом
Пять кейсов из практики aheadWorks с прологом и эпилогом
 
Guiding rules for choosing a reliable Magento development partner
Guiding rules for choosing a reliable Magento development partnerGuiding rules for choosing a reliable Magento development partner
Guiding rules for choosing a reliable Magento development partner
 
Developing trusted Magento extension
Developing trusted Magento extension Developing trusted Magento extension
Developing trusted Magento extension
 
Magento integration
Magento integrationMagento integration
Magento integration
 
Moving from Projects to Products: How Newcomers Can Do as Good as Veterans of...
Moving from Projects to Products: How Newcomers Can Do as Good as Veterans of...Moving from Projects to Products: How Newcomers Can Do as Good as Veterans of...
Moving from Projects to Products: How Newcomers Can Do as Good as Veterans of...
 
Writing extensions for Xcommerce
Writing extensions for XcommerceWriting extensions for Xcommerce
Writing extensions for Xcommerce
 
Top 10 problems supporting Magento customers
Top 10 problems supporting Magento customersTop 10 problems supporting Magento customers
Top 10 problems supporting Magento customers
 

Similar to Magento code debugging

PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капляmeet_magento
 
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...it-people
 
Разработка через тестирование в Python и Django #pyconru
Разработка через тестирование в Python и Django #pyconruРазработка через тестирование в Python и Django #pyconru
Разработка через тестирование в Python и Django #pyconruJetStyle
 
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoPycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoIlya Shalyapin
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf Conference
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
TestGuy - эмулируем вашего тестировщика
TestGuy - эмулируем вашего тестировщикаTestGuy - эмулируем вашего тестировщика
TestGuy - эмулируем вашего тестировщикаdavertmik
 
Unit test быстрый старт
Unit test быстрый стартUnit test быстрый старт
Unit test быстрый стартAntonio
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
Unit tests final
Unit tests finalUnit tests final
Unit tests finalcorehard_by
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf Conference
 

Similar to Magento code debugging (20)

PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
бегун
бегунбегун
бегун
 
Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капля
 
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
 
Разработка через тестирование в Python и Django #pyconru
Разработка через тестирование в Python и Django #pyconruРазработка через тестирование в Python и Django #pyconru
Разработка через тестирование в Python и Django #pyconru
 
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoPycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и Django
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
TestGuy - эмулируем вашего тестировщика
TestGuy - эмулируем вашего тестировщикаTestGuy - эмулируем вашего тестировщика
TestGuy - эмулируем вашего тестировщика
 
Unit test быстрый старт
Unit test быстрый стартUnit test быстрый старт
Unit test быстрый старт
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
бегун
бегунбегун
бегун
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
Unit tests final
Unit tests finalUnit tests final
Unit tests final
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Спецификация WSGI (PEP-333)
Спецификация WSGI (PEP-333)Спецификация WSGI (PEP-333)
Спецификация WSGI (PEP-333)
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
 

More from aheadWorks

Magento Meetup Belarus 2012 opening
Magento Meetup Belarus 2012 opening Magento Meetup Belarus 2012 opening
Magento Meetup Belarus 2012 opening aheadWorks
 
How to survive on Magento platform
How to survive on Magento platformHow to survive on Magento platform
How to survive on Magento platformaheadWorks
 
Magento Test Automation Framework
Magento Test Automation FrameworkMagento Test Automation Framework
Magento Test Automation FrameworkaheadWorks
 
How to Use Email Marketing More Effectively
How to Use Email Marketing More EffectivelyHow to Use Email Marketing More Effectively
How to Use Email Marketing More EffectivelyaheadWorks
 
Феномен IT-менеджера
Феномен IT-менеджераФеномен IT-менеджера
Феномен IT-менеджераaheadWorks
 
Email marketing для IT-стартапов
Email marketing для IT-стартаповEmail marketing для IT-стартапов
Email marketing для IT-стартаповaheadWorks
 
Первые шаги бизнеса
Первые шаги бизнесаПервые шаги бизнеса
Первые шаги бизнесаaheadWorks
 
Заставьте их покупать!
Заставьте их покупать!Заставьте их покупать!
Заставьте их покупать!aheadWorks
 

More from aheadWorks (8)

Magento Meetup Belarus 2012 opening
Magento Meetup Belarus 2012 opening Magento Meetup Belarus 2012 opening
Magento Meetup Belarus 2012 opening
 
How to survive on Magento platform
How to survive on Magento platformHow to survive on Magento platform
How to survive on Magento platform
 
Magento Test Automation Framework
Magento Test Automation FrameworkMagento Test Automation Framework
Magento Test Automation Framework
 
How to Use Email Marketing More Effectively
How to Use Email Marketing More EffectivelyHow to Use Email Marketing More Effectively
How to Use Email Marketing More Effectively
 
Феномен IT-менеджера
Феномен IT-менеджераФеномен IT-менеджера
Феномен IT-менеджера
 
Email marketing для IT-стартапов
Email marketing для IT-стартаповEmail marketing для IT-стартапов
Email marketing для IT-стартапов
 
Первые шаги бизнеса
Первые шаги бизнесаПервые шаги бизнеса
Первые шаги бизнеса
 
Заставьте их покупать!
Заставьте их покупать!Заставьте их покупать!
Заставьте их покупать!
 

Magento code debugging

  • 1. СПОСОБЫ ОТЛАДКИ ПРИ РАЗРАБОТКЕ ПОД MAGENTO Павел Новицкий Meet Magento Belarus 2012
  • 2. Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать. Брайан Керниган
  • 3. Magento в первую очередь — это PHP
  • 4. Популярные практики при отладке PHP приложений. 1. Вывод ошибок 2. Значения переменной 3. Структурные данные 4. Отслеживание выполнения кода 5. Исследование объектов 6. Запросы к БД
  • 5. Популярные практики при отладке PHP приложений. Вывод ошибок Значения переменной Структурные данные Отслеживание выполнения кода Исследование объектов Запросы к БД Вывод ошибок Непосредственно в приложении: В php.ini: ini_set('display_errors', 'On'); display_errors = On error_reporting(E_ALL | E_STRICT); error_reporting = E_ALL | E_STRICT
  • 6. Популярные практики при отладке PHP приложений. Вывод ошибок Значения переменной Структурные данные Отслеживание выполнения кода Исследование объектов Запросы к БД Вывод значения переменной echo $myVar; Практически бесполезно. В большинстве случаев — потраченное зря время.
  • 7. Популярные практики при отладке PHP приложений. Вывод ошибок Значения переменной Структурные данные Отслеживание выполнения кода Исследование объектов Запросы к БД Вывод структурных данных echo '<pre>'. var_dump($myArray); print_r($myArray, true). '</pre>'; Array ( array(2) { ["key1"]=> string(7) "value 1" ["key2"]=> [key1] => value 1 string(7) "value 2" } [key2] => value 2 )
  • 8. Популярные практики при отладке PHP приложений. Вывод ошибок Значения переменной Структурные данные Отслеживание выполнения кода Исследование объектов Запросы к БД Отслеживание выполнения кода debug_backtrace() и print_debug_backtrace()
  • 9. Популярные практики при отладке PHP приложений. Вывод ошибок Значения переменной Структурные данные Отслеживание выполнения кода Исследование объектов Запросы к БД Что же у нас за объект? get_class() get_class_vars() get_declared_classes() method_exists()
  • 10. Популярные практики при отладке PHP приложений. Вывод ошибок Значения переменной Структурные данные Отслеживание выполнения кода Исследование объектов Запросы к БД Запросы к БД a) echo $sql = "SELECT `some_field1` FROM `table` WHERE `some_field2` = '$var'"; b) $res = mysql_query($sql) or die(mysql_error());
  • 11. Для большинства приложений этого достаточно. А как же Magento?
  • 12. Применение стандартных практик в 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”
  • 13. Применение стандартных практик в Magento Вывод значения переменной Только для проверки какой-то промежуточной переменной. Точно также бесполезно.
  • 14. Применение стандартных практик в Magento Вывод структурных данных $customer = Mage::getModel('customer/customer')->load(1); print_r($customer);
  • 15. Применение стандартных практик в 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 ( ) )
  • 16. Применение стандартных практик в Magento Снова бесполезно?
  • 17. Применение стандартных практик в Magento Varien_Object::getData() Varien_Object::debug()
  • 18. Применение стандартных практик в Magento Вывод структурных данных $customer = Mage::getModel('customer/customer')->load(1); echo '<pre>'.print_r($customer->debug(), true);
  • 19. Применение стандартных практик в 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
  • 20. Применение стандартных практик в Magento Отслеживание выполнения кода debug_backtrace() Varien_Debug::backtrace() print_debug_backtrace()
  • 21. Применение стандартных практик в Magento Изучение объекта get_class() get_class_vars() get_declared_classes() method_exists() Используется повсеместно в Magento
  • 22. Применение стандартных практик в Magento Запросы к базе данных echo $sql = "SELECT `some_field1` FROM `table`”; $res = mysql_query($sql) or die(mysql_error());
  • 23. Применение стандартных практик в Magento Запросы к базе данных Вывести запрос: $myCollection->load(true); Записать запрос в системный лог: $myCollection->load(false, true);
  • 24. Применение стандартных практик в Magento Запросы к базе данных Mage::getModel('catalog/product')->getCollection()->load(true); $model = Mage::getModel('catalog/product')->getCollection(); $sql = $model->getSelect()->__toString(); echo $sql; SELECT `e`.* FROM `catalog_product_entity` AS `e`
  • 25. Применение стандартных практик в Magento Запросы к базе данных Записываем все запросы в var/debug/pdo_mysql.log lib/Varien/Db/Adapter/Pdo/Mysql.php: protected $_debug = true; protected $_logAllQueries= true;
  • 28. Экспериментируем <?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(); // … наш код …
  • 29. — швейцарский нож разработчика ОТЛАДКА и ПРОФАЙЛИНГ
  • 30. xDebug Установка http://xdebug.org/download.php Настройка xdebug.profiler_enable_trigger=on xdebug.remote_autostart=off xdebug.remote_enable=1 xdebug.remote_host="127.0.0.1" xdebug.remote_port=9000 xdebug.remote_handler="dbgp" xdebug.idekey="netbeans" xdebug.collect_vars=on xdebug.collect_params=4 xdebug.show_local_vars=on xdebug.var_display_max_depth=5 xdebug.show_exception_trace=on zend_extension=/usr/lib/php5/20090626+lfs/xdebug.so ; zend_extension_ts="c:phpextphp_xdebug-2.0.1-5.2.1.dll"
  • 31. xDebug Настройка NetBeans IDE
  • 32. xDebug И что же нам это даѐт? http://example.com/index.php?XDEBUG_SESSION_START=netbeans
  • 33. xDebug http://example.com/index.php?XDEBUG_SESSION_START=netbeans Xdebug helper http://bit.ly/KuCo2c easy Xdebug http://bit.ly/LKpvjC
  • 34. xDebug Профайлинг xdebug.profiler_enable=1
  • 35. 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
  • 36. К нам пришѐл клиент…
  • 38. <config> <modules> <Some_Module> <active>false</active> <Some_Module> </modules> </config>
  • 39.
  • 40. Magento Connect — developer tools Commerce Bug http://bit.ly/M8ggqh
  • 41. Magento Connect — developer tools Developer Toolbar for Magento http://bit.ly/LnSW8s
  • 42. Magento Connect — developer tools Advanced Developer Tools http://bit.ly/Lo1Vqa Только для версий ниже 1.6.1
  • 43. Magento Connect — developer tools Developer Toolbar http://bit.ly/LnD1Hk
  • 44. Magento Connect — developer tools Magento FirePHP http://bit.ly/LnYGyX Mage::helper('firephp')->send('Lorem ipsum sit amet ..'); Mage::helper('firephp')->debug(Mage::getModel('catalog/product')->load(54));
  • 45. Magento Connect — developer tools Developer Helper http://bit.ly/OLauwz