Nasıl PHP hataları üzerine bir hata izleme raporu üretmek için alabilirim?

10 Cevap php

Varsayılan mevcut hat-yalnızca hata iletileri kullanarak hata ayıklama PHP çalışılıyor korkunç. Hatalar üretilen zaman nasıl bir hata izleme raporu (yığın izleme) üretmek için PHP alabilirim?

10 Cevap

Xdebug hataları bir backtrace tablo yazdırır ve bunu uygulamak için herhangi bir PHP kodu yazmak zorunda değilsiniz.

Olumsuz bir PHP uzantısı olarak yüklemek zorunda değildir.

Bir hata izleme raporu üreten bir hata işleyicisi yüklemek için benim komut dosyası:

<?php
function process_error_backtrace($errno, $errstr, $errfile, $errline, $errcontext) {
    if(!(error_reporting() & $errno))
        return;
    switch($errno) {
    case E_WARNING      :
    case E_USER_WARNING :
    case E_STRICT       :
    case E_NOTICE       :
    case E_USER_NOTICE  :
        $type = 'warning';
        $fatal = false;
        break;
    default             :
        $type = 'fatal error';
        $fatal = true;
        break;
    }
    $trace = array_reverse(debug_backtrace());
    array_pop($trace);
    if(php_sapi_name() == 'cli') {
        echo 'Backtrace from ' . $type . ' \'' . $errstr . '\' at ' . $errfile . ' ' . $errline . ':' . "\n";
        foreach($trace as $item)
            echo '  ' . (isset($item['file']) ? $item['file'] : '<unknown file>') . ' ' . (isset($item['line']) ? $item['line'] : '<unknown line>') . ' calling ' . $item['function'] . '()' . "\n";
    } else {
        echo '<p class="error_backtrace">' . "\n";
        echo '  Backtrace from ' . $type . ' \'' . $errstr . '\' at ' . $errfile . ' ' . $errline . ':' . "\n";
        echo '  <ol>' . "\n";
        foreach($trace as $item)
            echo '    <li>' . (isset($item['file']) ? $item['file'] : '<unknown file>') . ' ' . (isset($item['line']) ? $item['line'] : '<unknown line>') . ' calling ' . $item['function'] . '()</li>' . "\n";
        echo '  </ol>' . "\n";
        echo '</p>' . "\n";
    }
    if(ini_get('log_errors')) {
        $items = array();
        foreach($trace as $item)
            $items[] = (isset($item['file']) ? $item['file'] : '<unknown file>') . ' ' . (isset($item['line']) ? $item['line'] : '<unknown line>') . ' calling ' . $item['function'] . '()';
        $message = 'Backtrace from ' . $type . ' \'' . $errstr . '\' at ' . $errfile . ' ' . $errline . ': ' . join(' | ', $items);
        error_log($message);
    }
    if($fatal)
        exit(1);
}

set_error_handler('process_error_backtrace');
?>

İhtar: Zend kendi bilgelik bu görmezden karar verdi çünkü, çeşitli 'PHP Fatal Errors' etkileyecek güçsüz set_error_handler(). Yani hala o işe yaramaz son-konum-yalnızca hataları olsun.

Daha gelişmiş bir çözüm için, PHP için XDebug uzantısını kullanabilirsiniz.

XDebug yüklenir Varsayılan olarak, herhangi bir ölümcül hata durumunda otomatik geri izleme göstermelidir. Yoksa tüm isteği çok büyük bir hata izleme raporu varsa veya profil (xdebug.profiler_enable) veya other settings yapmak için dosyanın (xdebug.auto_trace) içine iz. Izleme dosyası çok büyük ise, kısmi iz dökümü () xdebug_start_trace () ve xdebug_stop_trace kullanabilirsiniz.

Installation

PECL kullanma:

pecl install xdebug

Linux:

sudo apt-get install php5-xdebug

(Homebrew) ile Mac:

brew tap josegonzalez/php
brew search xdebug
php53-xdebug

Maden yapılandırma örneği:

[xdebug]

; Extensions
extension=xdebug.so
; zend_extension="/YOUR_PATH/php/extensions/no-debug-non-zts-20090626/xdebug.so"
; zend_extension="/Applications/MAMP/bin/php/php5.3.20/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so" ; MAMP

; Data
xdebug.show_exception_trace=1       ; bool: Show a stack trace whenever an exception is raised.
xdebug.collect_vars = 1             ; bool: Gather information about which variables are used in a certain scope.
xdebug.show_local_vars=1            ; int: Generate stack dumps in error situations.
xdebug.collect_assignments=1        ; bool: Controls whether Xdebug should add variable assignments to function traces.
xdebug.collect_params=4             ; int1-4: Collect the parameters passed to functions when a function call is recorded.
xdebug.collect_return=1             ; bool: Write the return value of function calls to the trace files.
xdebug.var_display_max_children=256 ; int: Amount of array children and object's properties are shown.
xdebug.var_display_max_data=1024    ; int: Max string length that is shown when variables are displayed.
xdebug.var_display_max_depth=3      ; int: How many nested levels of array/object elements are displayed.
xdebug.show_mem_delta=0             ; int: Show the difference in memory usage between function calls.

; Trace
xdebug.auto_trace=0                 ; bool: The tracing of function calls will be enabled just before the script is run.
xdebug.trace_output_dir="/var/log/xdebug" ; string: Directory where the tracing files will be written to.
xdebug.trace_output_name="%H%R-%s-%t"     ; string: Name of the file that is used to dump traces into.

; Profiler
xdebug.profiler_enable=0            ; bool: Profiler which creates files read by KCacheGrind.
xdebug.profiler_output_dir="/var/log/xdebug"  ; string: Directory where the profiler output will be written to.
xdebug.profiler_output_name="%H%R-%s-%t"      ; string: Name of the file that is used to dump traces into.
xdebug.profiler_append=0            ; bool: Files will not be overwritten when a new request would map to the same file.

; CLI
xdebug.cli_color=1                  ; bool: Color var_dumps and stack traces output when in CLI mode.

; Remote debugging
xdebug.remote_enable=off            ; bool: Try to contact a debug client which is listening on the host and port.
xdebug.remote_autostart=off         ; bool: Start a remote debugging session even GET/POST/COOKIE variable is not present.
xdebug.remote_handler=dbgp          ; select: php3/gdb/dbgp: The DBGp protocol is the only supported protocol.
xdebug.remote_host=localhost        ; string: Host/ip where the debug client is running.
xdebug.remote_port=9000             ; integer: The port to which Xdebug tries to connect on the remote host.
xdebug.remote_mode=req              ; select(req,jit): Selects when a debug connection is initiated.
xdebug.idekey="xdebug-cli"          ; string: IDE Key Xdebug which should pass on to the DBGp debugger handler.
xdebug.remote_log="/var/log/xdebug.log" ; string: Filename to a file to which all remote debugger communications are logged.

Ben sadece) (register_shutdown_function kullanarak baskı, sonra soruna hattında debug_backtrace içeriğini içeren bir oturum değişkeni () ayarı çalıştı. Bir cazibe gibi çalıştı.

Sen kullanabilirsiniz debug_backtrace

Php hata ayıklama uzantıları olarak, orada Xdebug ve PHP DBG. Her biri kendi avantajları ve dezavantajları vardır.

$backtrace = debug_backtrace();

i little article about backtracing Bir süre geri yazdı

PHP Error size hataları için bir yığın izlemesi vermek ve xDebug daha güzel olacaktır.

Aynı zamanda da ajax istekleri için çalışacağız.

PHP DeBugger also does a back trace similiar to PHP Error with more options.
If you want you can easily make your own with set_error_handler and debug_backtrace

set_error_handler ($error_handler, error_reporting);
/**
 * @var int $errno the error number
 * @var string $errstr the error message
 * @var string $errfile the error file
 * @var int $errline the line of the error
 */
$error_handler = function($errno, $errstr, $errfile, $errline){
    $trace = debug_backtrace();
    array_shift($backtrace);//remove the stack about this handler
    foreach($trace as $k => $v){
        //parse your backtrace
    }
}

Ayrıca BackTrace iç yığın için bazı tuşlar ayarlanamaz unutmayın. Eğer :) tüm hataları varsa onunla bir şeyler yapmadan önce anahtar varsa kontrol ettiğinizden emin olun

Bu bunu nasıl olduğunu:

set_error_handler(function($errorType){
    if(error_reporting() & $errorType){
        ?><pre><?
        debug_print_backtrace();
        ?></pre><?
    }
}) ;

Bu bir kapatma kullandığından beri + PHP 5.3 gerektirir. Eğer düşük PHP desteğe ihtiyacınız varsa, sadece normal bir işleve kapatma dönüştürmek.