Jak zalogować wszystkie Magento SQL?

23

Czy istnieje prosty sposób na zarejestrowanie wszystkich zapytań wykonanych przez Magento?

Celem jest wydrukowanie wszystkich wykonanych instrukcji SQL, na przykład podczas ładowania strony

Fra
źródło

Odpowiedzi:

43

Jeśli chcesz mieć pewność, że cały SQL jest faktycznie zalogowany, sugeruję użyć oprogramowania innej firmy:

  • Neonowy profil SQL jest właściwie darmowy i działa dobrze
    (musisz edytować local.xml, aby dołączyć Magento do Neon ... działa jako rodzaj proxy SQL rejestrującego wszystko, co przez niego przechodzi)

Alternatywnie natywne podejście Magento / Varien może być następujące:

  1. edytować lib/Varien/Db/Adapter/Pdo/Mysql.php
  2. zmień następujące właściwości na true(linia 103)
  3. będziesz mieć plik dziennika do utworzenia tutaj var/debug/pdo_mysql.log

Tutaj wiersz do zmiany: (komentarze są oczywiste)

 /**
     * Write SQL debug data to file
     *
     * @var bool
     */
    protected $_debug               = true;

    /**
     * Minimum query duration time to be logged
     *
     * @var float
     */
    protected $_logQueryTime        = 0.05;

    /**
     * Log all queries (ignored minimum query duration time)
     *
     * @var bool
     */
    protected $_logAllQueries       = true;

    /**
     * Add to log call stack data (backtrace)
     *
     * @var bool
     */
    protected $_logCallStack        = true;

Wytworzone dzienniki są następujące:

## 2014-06-26 12:18:47
## 10258 ## QUERY
SQL: SELECT `adminnotification_inbox`.* FROM `adminnotification_inbox` WHERE (title = 'Customize your order and invoice numbers to protect your sales using Order Number Customizer by XTENTO.') AND (url = 'http://www.xtento.com/magento-extensions/order-number-customizer.html?utm_source=feed&utm_medium=feed&utm_campaign=order_number_customizer')
AFF: 1
TIME: 0.0008

Jeśli włączyłeś $_logCallStack, będziesz mieć także partycję TRACE

TRACE: #1 Varien_Db_Adapter_Pdo_Mysql#00000000644036ff00007f14137095e6#->_debugStat(2, 'SELECT `adminnot...', array(), &Varien_Db_Statement_Pdo_Mysql#000000006440371700007f14137095e6#) called at [lib/Varien/Db/Adapter/Pdo/Mysql.php:424]
#2 Varien_Db_Adapter_Pdo_Mysql#00000000644036ff00007f14137095e6#->query(&Varien_Db_Select#000000006440371800007f14137095e6#, array()) called at [lib/Zend/Db/Adapter/Abstract.php:753]
#3 Varien_Db_Adapter_Pdo_Mysql[Zend_Db_Adapter_Abstract]#00000000644036ff00007f14137095e6#->fetchRow(&Varien_Db_Select#000000006440371800007f14137095e6#) called at [app/code/core/Mage/AdminNotification/Model/Resource/Inbox.php:116]
#4 Mage_AdminNotification_Model_Resource_Inbox#00000000644034c500007f14137095e6#->parse(&Mage_AdminNotification_Model_Inbox#00000000644034e900007f14137095e6#, array(array('severity' => 4, 'date_added' => '2013-10-23 13:00...', 'title' => 'Customizing your...', 'description' => 'Easily add new c...', 'url' => 'http://www.xtent...'), array('severity' => 4, 'date_added' => '2014-04-09 17:00...', 'title' => 'Customize your o...', 'description' => 'Customize your M...', 'url' => 'http://www.xtent...'), array('severity' => 4, 'date_added' => '2014-05-06 17:00...', 'title' => 'Process orders i...', 'description' => 'Process all your...', 'url' => 'http://www.xtent...'))) called at [app/code/core/Mage/AdminNotification/Model/Inbox.php:118]
#5 Mage_AdminNotification_Model_Inbox#00000000644034e900007f14137095e6#->parse(array(array('severity' => 4, 'date_added' => '2013-10-23 13:00...', 'title' => 'Customizing your...', 'description' => 'Easily add new c...', 'url' => 'http://www.xtent...'), array('severity' => 4, 'date_added' => '2014-04-09 17:00...', 'title' => 'Customize your o...', 'description' => 'Customize your M...', 'url' => 'http://www.xtent...'), array('severity' => 4, 'date_added' => '2014-05-06 17:00...', 'title' => 'Process orders i...', 'description' => 'Process all your...', 'url' => 'http://www.xtent...'))) called at [app/code/local/Xtento/XtCore/Model/Feed.php:57]
#6 Xtento_XtCore_Model_Feed#000000006440348500007f14137095e6#->checkUpdate(&Varien_Event_Observer#00000000644034d900007f14137095e6#) called at [app/code/core/Mage/Core/Model/App.php:1338]
#7 Mage_Core_Model_App#00000000644036ef00007f14137095e6#->_callObserverMethod(&Xtento_XtCore_Model_Feed#000000006440348500007f14137095e6#, 'checkUpdate', &Varien_Event_Observer#00000000644034d900007f14137095e6#) called at [app/code/core/Mage/Core/Model/App.php:1317]
#8 Mage_Core_Model_App#00000000644036ef00007f14137095e6#->dispatchEvent('controller_actio...', array('controller_actio...' => &Fishpig_Wordpress_Adminhtml_WordpressController#000000006440364a00007f14137095e6#)) called at [app/Mage.php:451]
#9 Mage::dispatchEvent('controller_actio...', array('controller_actio...' => &Fishpig_Wordpress_Adminhtml_WordpressController#000000006440364a00007f14137095e6#)) called at [app/code/core/Mage/Core/Controller/Varien/Action.php:528]
#10 Fishpig_Wordpress_Adminhtml_WordpressController[Mage_Core_Controller_Varien_Action]#000000006440364a00007f14137095e6#->preDispatch() called at [app/code/core/Mage/Adminhtml/Controller/Action.php:160]
#11 Fishpig_Wordpress_Adminhtml_WordpressController[Mage_Adminhtml_Controller_Action]#000000006440364a00007f14137095e6#->preDispatch() called at [app/code/core/Mage/Core/Controller/Varien/Action.php:408]
#12 Fishpig_Wordpress_Adminhtml_WordpressController[Mage_Core_Controller_Varien_Action]#000000006440364a00007f14137095e6#->dispatch('checkVersion') called at [app/code/core/Mage/Core/Controller/Varien/Router/Standard.php:250]
#13 Mage_Core_Controller_Varien_Router_Admin[Mage_Core_Controller_Varien_Router_Standard]#00000000644036ae00007f14137095e6#->match(&Mage_Core_Controller_Request_Http#000000006440365c00007f14137095e6#) called at [app/code/core/Mage/Core/Controller/Varien/Front.php:176]
#14 Mage_Core_Controller_Varien_Front#000000006440365700007f14137095e6#->dispatch() called at [app/code/core/Mage/Core/Model/App.php:354]
#15 Mage_Core_Model_App#00000000644036ef00007f14137095e6#->run(array('scope_code' => '', 'scope_type' => 'store', 'options' => array())) called at [app/Mage.php:687]
#16 Mage::run('', 'store') called at [index.php:87]
Fra
źródło
15

Aktywuj Zend SQL Profiler z następującym węzłem w swoim app/etc/local.xml

<resources>
 <default_setup>
  <connection>
   <profiler>1</profiler>

Następnie możesz uzyskać dostęp do profilera gdzieś w kodzie i uzyskać wiele informacji o wszystkich wykonanych zapytaniach:

$profiler = Mage::getSingleton('core/resource')->getConnection('core_write')->getProfiler();

Aby po prostu wyprowadzić wszystkie zapytania:

print_r($profiler->getQueryProfiles());

Możesz dodać te dwa wiersze na końcu, index.phpaby zobaczyć wszystkie zapytania na dole każdej strony. Pamiętaj, że spowoduje to uszkodzenie żądań AJAX, które zwracają odpowiedź JSON, dlatego możesz rozważyć rejestrowanie zapytań zamiast ich drukowania przy użyciu tego kodu (ponownie dodaj go na końcu index.php):

$profiler = Mage::getSingleton('core/resource')->getConnection('core_write')->getProfiler();
Mage::log(print_r($profiler->getQueryProfiles(), true), null, 'queries.log', true);

Następnie znajdziesz wszystkie zapytania w var/log/queries.log

Nie zapomnij usunąć linii ponownie po zakończeniu debugowania!

Fabian Schmengler
źródło
2

Nie jestem w 100% pewien, że złapie każde zapytanie, ale większość z nich korzysta z metody zapytania Zend_Db_Adapter_Abstract metoda zapytania w

lib / Zend / Db / Adapter / Abstract.php

Mając to na uwadze, możesz tymczasowo dodać kilka instrukcji debugowania (do utworzonej kopii

app / code / local / Mage

być bezpiecznym)

public function query($sql, $bind = array())
{
    // connect to the database if needed
    $this->_connect();

    // is the $sql a Zend_Db_Select object?
    if ($sql instanceof Zend_Db_Select) {
        if (empty($bind)) {
            $bind = $sql->getBind();
        }

        $sql = $sql->assemble();
    }
    echo '$sql' . "\n<br />\n";
    var_dump($bind);
TBI Infotech
źródło
2
Myślę, że raz zastosowałem podobne podejście, ale bardziej mi się podobała metoda zaproponowana przeze mnie :)
Fra
„tymczasowo dodaj niektóre instrukcje debugowania, aby być bezpiecznym”. W tym podejściu nie ma nic bezpiecznego.
Kevin Schroeder
2

Jeśli masz dostęp do serwera mysql i nie masz innych projektów uruchamiających zapytania, możesz spróbować dodać ogólny dziennik z mysql. Zobacz, jak to zrobić /programming/6479107/how-to-enable-mysql-query-log, ponieważ zapisuje on wszystkie zapytania, które plik dziennika może bardzo szybko powiększyć, więc pamiętaj, aby włączyć po zakończeniu.

Emi
źródło