Upload
pavel-novitsky
View
710
Download
2
Embed Size (px)
Citation preview
СПОСОБЫ ОТЛАДКИ ПРИ РАЗРАБОТКЕ ПОД 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] => [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
Вывод структурных данных
Применение стандартных практик в 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] => [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
Вывод структурных данных
Отслеживание выполнения кода
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>
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
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
СПАСИБО ЗА ВНИМАНИЕ