SlideShare a Scribd company logo
1 of 46
Download to read offline
СПОСОБЫ ОТЛАДКИ
ПРИ РАЗРАБОТКЕ ПОД 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>
Meet Magento Belarus debug Pavel Novitsky (rus)
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
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Yii2
Yii2Yii2
Yii2Noveo
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассовAndrey Zakharevich
 
В помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кодаВ помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кодаAndrey Karpov
 
Web осень 2013 лекция 4
Web осень 2013 лекция 4Web осень 2013 лекция 4
Web осень 2013 лекция 4Technopark
 
Подробная презентация 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
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8Technopark
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвMail.ru Group
 
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
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Yii2
Yii2Yii2
Yii2
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
В помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кодаВ помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кода
 
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
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий Копачёв
 
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

Viewers also liked (7)

Pancreatitis chronic лiкарi
Pancreatitis chronic лiкарiPancreatitis chronic лiкарi
Pancreatitis chronic лiкарi
 
Quiz on Tourism
Quiz on TourismQuiz on Tourism
Quiz on Tourism
 
Markets and brokers
Markets and brokersMarkets and brokers
Markets and brokers
 
Investment alternatives
Investment alternativesInvestment alternatives
Investment alternatives
 
War of digital tvs
War of digital tvsWar of digital tvs
War of digital tvs
 
Investment alternatives
Investment alternativesInvestment alternatives
Investment alternatives
 
Investment Alternatives
Investment AlternativesInvestment Alternatives
Investment Alternatives
 

Similar to Meet Magento Belarus debug Pavel Novitsky (rus)

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
 
Unit tests final
Unit tests finalUnit tests final
Unit tests finalcorehard_by
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это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 Meet Magento Belarus debug Pavel Novitsky (rus) (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
 
бегун
бегунбегун
бегун
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Unit tests final
Unit tests finalUnit tests final
Unit tests final
 
Спецификация 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)
 

Meet Magento Belarus debug Pavel Novitsky (rus)

  • 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>
  • 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