error_log в том же каталоге, что и включенные файлы?

Я исследовал различные методы и директивы, в том числе:

  • auto_prepend_file
  • файлы.user.ini
  • getcwd ()
  • debug_backtrace ()

И я не могу найти способ изменить путь error_log, чтобы войти в тот же путь, что и файл, который включен / требуется.

Например, скажем, у index.php есть строка:

include('subdir/file.php');

Если subdir/file.php имеет синтаксическую ошибку, заставляющую php создавать subdir/error_logвместо поведения по умолчанию создания error_log по тому же пути, что и index.phpНа auto_prepend_file накладывается такое же ограничение, поскольку он добавляет указанный файл перед вызовом первого сценария, а не каждый включенный файл.

Я огляделся и не могу найти законный способ сделать это. Делая это, я понимаю последствия снижения производительности и планирую использовать его только в целях разработки. Я считаю, что это может помочь изолировать ошибки, а не использовать трассировки стека, такие как debug_backtrace(), так как я могу использовать скрипт терминала, чтобы показать последние журналы ошибок по последним изменениям и найти нарушающие файлы гораздо быстрее, чем читать массивный журнал ошибок.

Моя цель, в конечном счете, состоит в том, чтобы эти файлы вообще не появлялись, очевидно, в качестве отладки уже существующих сайтов и необходимости просматривать журналы ошибок объемом 10 ГБ или tail/multitailЭто может быть несколько громоздким. Я пытаюсь разработать этот метод, чтобы ошибки можно было выделить по пути. Какие-либо предложения?

1 ответ

Решение

Основываясь на вышеизложенных предложениях Хакре, я создал этот скрипт для включения в начало любого php-скрипта:

(также вот суть, которую я сделал из этого файла, если вы хотите его разветвить / скачать: просмотр на github)

<?
function custom_error_debug($errno, $errstr, $errfile, $errline, $errvars) {
  $message = "";
  $message .= "[ " . date('Y-m-d h-i-s') . " ] Error: [$errno] $errstr on line $errline of $errfile ";

  //Dump all info to browser!
  //WARNING: Leave this commented except for extreme cases where you need to see all variables in use!
  //Using this will cause excessive processing time, and RAM. Use only as needed!
  /*if (!empty($errvars)) {
     echo $message . PHP_EOL . "Variables in use: <pre>";print_r($errvars); echo "</pre>";
     //WARNING: not ending execution here may cause the browser to overload on larger frameworks, comment out at your own risk!
     die();
  }*/

  //get the directory of the offending file, put a log in that path, and separate them by end of line, append to file
  file_put_contents ( dirname($errfile) . "/php_errors.log", $message . PHP_EOL, FILE_APPEND );

  //Dump all variables to file as well, (MAY CAUSE LARGE FILES, read above)
  //file_put_contents ( dirname($errfile) . "/php_errors.log", $errvars . PHP_EOL, FILE_APPEND );

  //Optionally end script execution
  //die();
}
set_error_handler('custom_error_debug');
?>
Другие вопросы по тегам