2017-12-31 204 views
6

Aşağıdaki çağrıları kancalamak ve debug_backtrace() ile yığın izlerini yazdırmak için register_tick_function() kullanmak istiyorum. Aşağıdaki kodu çalıştırırsamPHP debug_backtrace() tarafından çağrılan register_tick_function() tüm yığınını döndürmez

.

<?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()); 

Yalnızca dump() işlevini yazdırır.

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

Neden print() ve array_search() iz veri göremiyorum? dump()'u çağırmadan önce yığının sıfırlanması gibi. Ayrıca geçmişte düzgün çalıştığından da eminim.

+2

: https://bugs.php.net/bug.php? id = 70188 –

+0

Test edildi. Win, Ubuntu, docker (ubuntu) PHP 7.1'de kopyalanamadı. Win, Ubuntu, docker (ubuntu) PHP 5.6'da kopyalanamadı. –

+1

Bunu http://phpio.net/s/6v6g adresinde denedim ve herhangi bir PHP sürümünde de çalışmıyor gibi görünüyor. Bunu görelim: https://stackoverflow.com/questions/7241834/debug-backtrace-from-registered-shutdown-function-in-php. Bu bir register_shutdown_function hakkında olsa da, aynı olabilir. İz, yalnızca, aranmakta olduğu yerden başlayabilir, bu durumda gerçekleşmeyebilir. Daha fazla: 'print (" "); ' dump(); ' ' array_search ('yeşil', Array()); ' ' dump(); ' Yani bu durumda, gerçekten başka bir şeyin içinden çağrılmadığı için kendini izliyor. – Huy

cevap

1

Backtrace'in ne olduğunu yanlış anlıyorsunuz, bu yığın PHP'nin belirli bir kod satırına ulaşmadan önce gerçekleştirdiği işlevlerin bir listesi değil, PHP'nin yorumlayıcısını belirli bir kod satırında olmasını haklı kılan yuvalanmış işlevlerin listesidir. .

İlk öğe, her zaman şu anda içinde bulunduğunuz işlev olacaktır, bir sonraki işlev bu işlevi çağrıştıran işlev olacaktır. Bir işlev döndüğünde, artık yığınta değil.

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 betiğinizi yorumlarken, geçerli yığından ekleme ve çıkarma işlemlerinizi gerçekleştirir. Backtrace yığınının yeri, PHP'nin kronolojik sırada hangi işlevlerin çağrıldığını günlüğe kaydetmesiydi.

ikincisi için

, bu buldum bir çözümdür: Bu bir kaç yıl önce bir hata bildirilmiştir, ama sonra tekrarlanabilir değildi Get a called functions list in PHP

İlgili konular