2017-12-31 95 views
6

वापस नहीं करता है, मैं निम्नलिखित कॉल को हुक करने के लिए register_tick_function() का उपयोग करना चाहता हूं और debug_backtrace() के साथ अपने स्टैक ट्रेस को प्रिंट करना चाहता हूं।register_tick_function() द्वारा कॉल किया गया PHP debug_backtrace() पूर्ण स्टैक

यदि मैं निम्नलिखित कोड चलाता हूं।

<?php 

function dump() { 
    // Replace this with var_dump(debug_backtrace()); to print the entire trace. 
    foreach (debug_backtrace() as $trace) 
    echo("Function ${trace['function']}() has been called" . PHP_EOL); 
} 

declare(ticks = 1); 
register_tick_function('dump'); 

print(""); 
array_search('green', Array()); 

यह केवल dump() फ़ंक्शन प्रिंट करता है।

Function dump() has been called 
Function dump() has been called 
Function dump() has been called 

मैं क्यों print() और array_search() ट्रेस डेटा नहीं दिख रहा? ऐसा लगता है कि dump() को आमंत्रित करने से पहले स्टैक को रीसेट कर दिया गया है। मुझे भी यकीन है कि यह अतीत में ठीक से काम करता है।

+2

यह एक बग के रूप में एक जोड़ी साल पहले सूचना मिली थी, लेकिन तब प्रतिलिपि प्रस्तुत करने योग्य नहीं था: https://bugs.php.net/bug.php? आईडी = 70188 –

+0

परीक्षण किया गया। विन, उबंटू, डॉकर (उबंटू) पर PHP 7.1 में दोहराने में असमर्थ। विन, उबंटू, डॉकर (उबंटू) पर PHP 5.6 में दोहराने में असमर्थ। –

+1

मैंने इसे http://phpio.net/s/6v6g पर करने की कोशिश की, और ऐसा लगता है कि वहां किसी भी PHP संस्करण में काम नहीं है। तो इसे एक देखें: https://stackoverflow.com/questions/7241834/debug-backtrace-from-registered-shutdown-function-in-php। हालांकि वह register_shutdown_function के बारे में है, यह वही हो सकता है। ट्रेस केवल उस स्थान से शुरू हो सकता है जहां इसे कहा जा रहा है, जो इस मामले में नहीं हो रहा है। यह इस तरह है: 'प्रिंट (" ");' 'डंप();' 'array_search ('हरा', ऐरे());' 'डंप();' तो इस मामले में, यह वास्तव में खुद को ढूंढ रहा है क्योंकि इसे किसी और चीज से नहीं बुलाया जा रहा है। – Huy

उत्तर

1

आप बैकट्रैक क्या गलत समझ रहे हैं, यह ढेर कोड की एक निश्चित पंक्ति तक पहुंचने से पहले निष्पादित कार्यों की एक सूची नहीं है, बल्कि नेस्टेड फ़ंक्शंस की सूची है जो PHP के दुभाषिया को कोड की एक विशिष्ट पंक्ति पर उचित ठहराने के लिए उचित है ।

पहला तत्व हमेशा उस फ़ंक्शन का होगा जो आप वर्तमान में कर रहे हैं, अगला वह फ़ंक्शन होगा जिसे उस फ़ंक्शन कहा जाता है और इसी तरह। यदि कोई फ़ंक्शन लौटाता है, तो यह अब ढेर में नहीं है।

class Foo { 
    public static function bar() { 
     return self::say(); 
    } 

    public static function say() { 
     return debug_backtrace(); 
    } 
} 

var_dump(Foo::say()); 
//[0] => say() 

var_dump(Foo::bar()); 
//[0] => say(); 
//[1] => bar(); 

//Note that this behaviour work the same for require(), include() and eval() 

require_once('test.php'); 

//test.php: 
var_dump(debug_backtrace()); 
//[0] => require_once() 

पीएचपी अपनी स्क्रिप्ट की व्याख्या के रूप में, यह आपके कार्यों संचालन करता है, जोड़ने और वर्तमान ढेर से निकालने। बैकट्रैस का ढेर स्थान नहीं था PHP शब्द लॉगऑनोलॉजिकल क्रम में कौन से कार्यों को बुलाया गया था।

पिछले के लिए, यह एक समाधान मैंने पाया है: Get a called functions list in PHP

संबंधित मुद्दे