Я исследовал различные методы и директивы, включая:
И я не могу найти способ изменить путь к файлу 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
доступ, это может быть несколько громоздким. Я пытаюсь разработать этот метод, чтобы ошибки могли быть изолированы по пути. Какие-либо предложения?
Основываясь на предложениях hakre выше, я создал этот скрипт, который будет включен в начало любого скрипта php:
(также вот суть, которую я сделал из этого файла, если вы хотите использовать fork / download: view on github )
<? function custom_error_debug($errno, $errstr, $errfile, $errline, $errvars) { $message = ""; $message .= "[ " . date('Ymd hi-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'); ?>