Это лучший отчет об ошибках для PHP, написанный на PHP. Никаких дополнительных расширений не требуется!
Тривиально использовать, когда все ошибки отображаются в браузере для обычных запросов AJAXy (в состоянии паузы). Затем все ошибки предоставляют вам обратную трассировку и контекст кода по всей трассировке стека, включая аргументы функций, переменные сервера.
Все, что вам нужно сделать, это включить один файл и вызвать функцию (в начале кода), например,
require('php_error.php');
\php_error\reportErrors();
Смотрите скриншоты:
GitHub: https://github.com/JosephLenton/PHP-Error
Моя вилка (с дополнительными исправлениями): https://github.com/kenorb-contrib/PHP-Error
Полный класс отладчика PHP с поддержкой исключений, ошибок, предупреждений (от пользователя), строк кода и флагов выделения.
Пример использования:
<?php
include( dirname(dirname(__FILE__)) . '/src/Debug.php' );
//Catch all
Debug::register();
//Generate an errors
if( this_function_does_not_exists( ) )
{
return false;
}
?>
Обработка ошибок в PHP
В приведенном ниже примере показана обработка внутренних исключений путем вызова ошибок и их обработки с помощью определенной пользователем функции:
Короткий путь (PHP):
<?php
function e($number, $msg, $file, $line, $vars) {
print_r(debug_backtrace());
die();
}
set_error_handler('e');
Более длинный путь (PHP):
// set to the user defined error handler
$old_error_handler = set_error_handler("myErrorHandler");
// error handler function
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
// This error code is not included in error_reporting
return;
}
switch ($errno) {
case E_USER_ERROR:
echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
echo " Fatal error on line $errline in file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Aborting...<br />\n";
var_dump(debug_backtrace());
exit(1);
break;
case E_USER_WARNING:
echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
break;
case E_USER_NOTICE:
echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
break;
default:
echo "Unknown error type: [$errno] $errstr<br />\n";
break;
}
/* Don't execute PHP internal error handler */
return true;
}
См .: http://www.php.net/manual/en/function.set-error-handler.php
Примечание. Одновременно может быть только одно исключение ошибки. Когда вы вызываете функцию set_error_handler (), она возвращает имя старого обработчика ошибок. Вы можете сохранить это и вызвать его самостоятельно из вашего обработчика ошибок, что позволит вам иметь несколько обработчиков ошибок.
XDebug
Для более продвинутого решения вы можете использовать расширение XDebug для PHP.
По умолчанию, когда загружен XDebug, он должен автоматически показывать вам обратную трассировку в случае любой фатальной ошибки. Или вы выполняете трассировку в файл (xdebug.auto_trace), чтобы получить очень большой обратный след всего запроса, или выполняете профилирование (xdebug.profiler_enable) или другие настройки . Если файл трассировки слишком большой, вы можете использовать xdebug_start_trace () и xdebug_stop_trace () для выгрузки частичной трассировки.
Установка
Использование PECL:
pecl install xdebug
В Linux:
sudo apt-get install php5-xdebug
на Mac (с домашним пивом):
brew tap josegonzalez/php
brew search xdebug
php53-xdebug
Пример конфигурации шахты:
[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.
Drupal 6 & 7
С включенным Devel:
/**
* Implements hook_watchdog().
*/
function foo_watchdog($log_entry) {
if ($log_entry['type'] == 'php' && $log_entry['severity'] <= WATCHDOG_WARNING) {
function_exists('dd') && dd(debug_backtrace());
}
}
Вышеуказанная функция будет записывать следы каждой ошибки во временный файл (/tmp/drupal_debug.txt
по умолчанию).
Или найдите файл с помощью: drush eval "echo file_directory_temp() . '/drupal_debug.txt'
.
Без включения Devel, используйте подход старой школы: var_dump(debug_backtrace());
вместо dd()
.