PHP のバックトレース関数 (debug_backtrace
およびdebug_print_backtrace
) に慣れるか、Magento/ラージ オブジェクト セーフ バージョンのmageDebugBacktrace
.
たとえば、controller_action_predispatch
イベントのオブザーバーをセットアップしています。オブザーバーに次のものを入れると(オブザーバーは2回呼び出される可能性があるexit
ため、特定のケースではしたくない場合があります)
class Pulsestorm_Requestset_Model_Observer
{
public function myMethod($observer)
{
mageDebugBacktrace();
exit;
}
}
次にページをロードすると、システム内の任意のページをロードしようとすると、次の出力が得られます (そのイベントはほぼすべてのページで発生するため)。
[1] /magento/app/code/core/Mage/Core/Model/App.php:1343
[2] /magento/app/code/core/Mage/Core/Model/App.php:1322
[3] /magento/app/Mage.php:455
[4] /magento/app/code/core/Mage/Core/Controller/Varien/Action.php:530
[5] /magento/app/code/core/Mage/Core/Controller/Front/Action.php:64
[6] /magento/app/code/core/Mage/Core/Controller/Varien/Action.php:408
[7] /magento/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php:251
[8] /magento/app/code/core/Mage/Core/Controller/Varien/Front.php:176
[9] /magento/app/code/core/Mage/Core/Model/App.php:352
[10] /magento/app/Mage.php:691
[11] /magento/index.php:87
これにより、呼び出した時点までの簡略化されたコールスタックが得られますmageDebugBacktrace
。は、区切ら[#]
れた文字列が続く単なるリストの順序です。:
文字列の左側 ( /magento/app/code/core/Mage/Core/Model/App.php
) は PHP ファイル、文字列の右側 ( 1343
) はメソッド呼び出しが発生した行番号です。
最初の 3 つの呼び出し
[1] /magento/app/code/core/Mage/Core/Model/App.php:1343
[2] /magento/app/code/core/Mage/Core/Model/App.php:1322
[3] /magento/app/Mage.php:455
イベント自体をディスパッチした PHP コードです。たとえば、Mage.php
私のシステムの 455 行目は
$result = self::app()->dispatchEvent($name, $data);
これは (通常、Magento のバージョン/コアの状態によって異なります)、イベントがディスパッチされた場所を指すスタック内の 4 番目の呼び出しです。
[4] /magento/app/code/core/Mage/Core/Controller/Varien/Action.php:530
私のシステムの行530
はAction.php
Mage::dispatchEvent('controller_action_predispatch', array('controller_action' => $this));
ビンゴ! Mage::dispatchEvent
はイベントをディスパッチするコードなので、ディスパッチ ポイントが見つかりました。
前述のように、オブザーバーが複数回呼び出されている可能性があります。そのため、出力バッファリングを使用してデータをログに記録する方が、上記で使用した出力/出口よりも優れている場合があります。
ob_start();
mageDebugBacktrace();
$contents = ob_get_clean();
Mage::Log($contents);
#If `Mage::log` is failing early in the bootstrap process
#file_put_contents('/tmp/trace.log', $contents . "\n",FILE_APPEND);