meet magento belarus debug pavel novitsky (rus)
TRANSCRIPT
![Page 1: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/1.jpg)
СПОСОБЫ ОТЛАДКИ ПРИ РАЗРАБОТКЕ ПОД MAGENTO
Павел Новицкий
Meet Magento Belarus 2012
![Page 2: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/2.jpg)
Отладка кода вдвое сложнее, чем его написание.
Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Брайан Керниган
![Page 3: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/3.jpg)
Magento в первую очередь — это PHP
![Page 4: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/4.jpg)
Популярные практики при отладке PHP приложений.
1. Вывод ошибок
2. Значения переменной
3. Структурные данные
4. Отслеживание выполнения
кода
5. Исследование объектов
6. Запросы к БД
![Page 5: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/5.jpg)
Вывод ошибок
В 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)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/6.jpg)
Вывод значения переменной
echo $myVar;
Практически бесполезно.
В большинстве случаев — потраченное зря время.
Вывод ошибокЗначения переменнойСтруктурные данныеОтслеживание выполнения кодаИсследование объектовЗапросы к БД
Популярные практики при отладке PHP приложений.
![Page 7: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/7.jpg)
Вывод структурных данных
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)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/8.jpg)
Отслеживание выполнения кода
debug_backtrace() и print_debug_backtrace()
Вывод ошибокЗначения переменнойСтруктурные данныеОтслеживание выполнения кодаИсследование объектовЗапросы к БД
Популярные практики при отладке PHP приложений.
![Page 9: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/9.jpg)
Что же у нас за объект?
get_class()
get_class_vars()
get_declared_classes()
method_exists()
Вывод ошибокЗначения переменнойСтруктурные данныеОтслеживание выполнения кодаИсследование объектовЗапросы к БД
Популярные практики при отладке PHP приложений.
![Page 10: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/10.jpg)
Запросы к БД
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)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/11.jpg)
Для большинства приложений этого достаточно.
А как же Magento?
![Page 12: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/12.jpg)
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)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/13.jpg)
Только для проверки какой-то промежуточной переменной.
Точно также бесполезно.
Применение стандартных практик в Magento
Вывод значения переменной
![Page 14: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/14.jpg)
$customer = Mage::getModel('customer/customer')->load(1);
print_r($customer);
Применение стандартных практик в Magento
Вывод структурных данных
![Page 15: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/15.jpg)
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)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/16.jpg)
Применение стандартных практик в Magento
Снова бесполезно?
![Page 17: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/17.jpg)
Применение стандартных практик в Magento
Varien_Object::getData()
Varien_Object::debug()
![Page 18: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/18.jpg)
$customer = Mage::getModel('customer/customer')->load(1);
echo '<pre>'.print_r($customer->debug(), true);
Применение стандартных практик в Magento
Вывод структурных данных
![Page 19: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/19.jpg)
[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)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/20.jpg)
Отслеживание выполнения кода
debug_backtrace()
print_debug_backtrace()
Применение стандартных практик в Magento
Varien_Debug::backtrace()
![Page 21: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/21.jpg)
Применение стандартных практик в Magento
Изучение объекта
get_class()
get_class_vars()
get_declared_classes()
method_exists()
Используется повсеместно в Magento
![Page 22: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/22.jpg)
Запросы к базе данных
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)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/23.jpg)
Запросы к базе данных
Вывести запрос:
$myCollection->load(true);
Записать запрос в системный лог:
$myCollection->load(false, true);
Применение стандартных практик в Magento
![Page 24: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/24.jpg)
Запросы к базе данных
$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)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/25.jpg)
Запросы к базе данных
Записываем все запросы в 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)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/26.jpg)
Что ещё?
![Page 27: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/27.jpg)
Логирование
![Page 28: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/28.jpg)
Экспериментируем
<?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)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/29.jpg)
— швейцарский нож разработчика
ОТЛАДКА и ПРОФАЙЛИНГ
![Page 30: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/30.jpg)
Установка
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)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/31.jpg)
xDebug
Настройка NetBeans IDE
![Page 32: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/32.jpg)
xDebug
И что же нам это даёт?http://example.com/index.php?XDEBUG_SESSION_START=netbeans
![Page 33: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/33.jpg)
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)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/34.jpg)
Профайлинг
xdebug.profiler_enable=1
xDebug
![Page 35: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/35.jpg)
Визуализация логов
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)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/36.jpg)
К нам пришёл клиент…
![Page 37: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/37.jpg)
<disable_local_modules>true</disable_local_modules>
![Page 38: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/38.jpg)
<config><modules>
<Some_Module><active>false</active>
<Some_Module></modules>
</config>
![Page 39: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/39.jpg)
![Page 41: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/41.jpg)
Developer Toolbar for Magento http://bit.ly/LnSW8s
Magento Connect — developer tools
![Page 42: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/42.jpg)
Advanced Developer Tools http://bit.ly/Lo1Vqa
Magento Connect — developer tools
Только для версий ниже 1.6.1
![Page 44: Meet Magento Belarus debug Pavel Novitsky (rus)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/44.jpg)
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)](https://reader033.vdocuments.site/reader033/viewer/2022051212/557ed18bd8b42ae27f8b4e7e/html5/thumbnails/45.jpg)
Magento Connect — developer tools
Developer Helper http://bit.ly/OLauwz