2013-09-10 4 views
3

Я исследовал различные методы и директивы, включая: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. Это может быть несколько громоздким. Я пытаюсь разработать этот метод, чтобы ошибки могли быть изолированы по пути. Какие-либо предложения?

+0

Я не уверен, что ваша идея получается на практике, но включая файл, не должна означать, что рабочий каталог изменяется. Единственный шанс, я вижу, что вы создаете свою собственную функцию обработки ошибок (http://php.net/set_error_handler), которая просматривает обратную трассировку для файла ошибки (обратите внимание, что некоторые ошибки не находятся в файле, но «никуда» «так что вам нужно искать * последний файл»), а затем войдите в этот каталог (http://php.net/error_log). Вы регистрируете этот обработчик в * * auto_prepend_file' *. – hakre

+0

* «Журналы ошибок 10 ГБ» * - сначала вам нужно исправить другую проблему, например. сначала закройте этот большой шар. также на короткое время, если огромное количество сообщений является подавляющим, не регистрируйте повторяющиеся ошибки: http://stackoverflow.com/q/1964732/367456 (может не помочь вам, просто говоря) – hakre

+0

Мне нравится идея не регистрировать повторяющиеся ошибки. Я столкнулся с некоторыми сайтами Magento и Wordpress, которые уже существуют, поэтому, как правило, если я нахожу большой журнал ошибок, я бы переименовал его (как это делал большинство людей) и захватил новый, который появится. Однако в контексте php, когда все включено во время выполнения, если не кэшировано уже, это может не помочь, если я прав, это только остановит повторяющиеся ошибки от одного и того же запроса и не будет каждый раз обрезать журнал см., существует ли ошибка. Правильно ли я принимаю? – DWils

ответ

2

На основе предложений hakre в выше, я создал этот сценарий, чтобы быть включенным в верхней части любой PHP скрипт:

(здесь также является сутью я сделал из этого файла, если вы хотите, чтобы вилка/скачать это: view on 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'); 
?>