Еше один мой ночной бред, но вроде бы на этот раз внятный. Что може: дебаг мод (по моему удался), логирование, отправка на почту (это не проверял). Говорит что за ошибка, в каком файле, на какой линии, выводит пронумерованный код с подсветкой и print_r всего что можно. Просто скопируйте себе весь код и не забудьте создать файл с логом error.log в той же папке, если понравится смотрите __construct PHP: <?php /** * Description of Error * Класс для обработки ошибок * @author padaboo */ class Error { /** * Типы ошибок * @var array $errortype */ private $errortype = array ( 1 => 'Ошибка', 2 => 'Опасность', 4 => 'Синтаксическая ошибка', 8 => 'Предупреждение', 16 => 'Ошибка ядра', 32 => 'Опасность ядра', 64 => 'Ошибка компилирования', 128 => 'Опасность компилирования', 256 => 'Ошибка пользователя', 512 => 'Опасность пользователя', 1024 => 'Предупреждение пользователя', 2048 => 'Предупреждение времени выполнения', 4096 => 'Фатальная ошибка ' ); /** * включен или выключен дебаг * 1 или 0 * @var int $debug */ private $debug; /** * включено или выключено логирование * 1 или 0 * @var int $log */ private $log; /** * Сообщение которое получит пользователь * в случае ошибки * @var string $userMessage */ private $userMessage; /** * Сообщеник которое получит * разработчик при включенном * дебаге в ini файле * @var string $debugMessage */ private $debugMessage; /** * Сообщение которое пойдет * в лог файл * @var string $logMessage */ private $logMessage; /** * Путь до файла с логами * @var string $logFile */ private $logFile = ''; /** * нужно ли отправлять почту * с ошибкой админу (0/1) * @var string $mail */ private $mail; /** * почта * @var string $adminMail */ private $adminMail; /** * Путь до файла с логом * @param string $file * нужно ли записывать в лог ошибка * @param int $log (1/0) * дебаг * @param int $debug (1/0) * нужно ли отправлять ошибку на почту * @param int $mail (1/0) * почта * @param string $adminMail */ public function __construct($file, $log, $debug, $mail = 0, $adminMail = ''){ if(!file_exists($file)){ die("Не найден файл $file для логов"); } $this->logFile = $file; $this->log = $log; $this->debug = $debug; $this->mail = $mail; $this->adminMail = $adminMail; } /** * Функиция для обработки ошибок */ public function handler($errno, $errstr, $errfile, $errline){ $this->userMessage = "Произошла ошибка, отряд специальо обученных макак уже отправлен на устранение неполадок"; $this->debugMessage = $this->getDebugMessage($errno, $errstr, $errfile, $errline); $this->logMessage = '['.date('d.m.Y H:i:s', time()).']' . "[".$this->errortype[$errno]. "] $errstr in file $errfile on in line $errline \r\n"; $this->display(); } /** * Выводит отладочную информацию. */ private function display(){ echo ($this->debug)? $this->debugMessage : $this->userMessage; if ($this->log) error_log($this->logMessage, 3, $this->logFile); if($this->mail){ //спасибо Apple :); if(!filter_var($this->adminMail, FILTER_VALIDATE_EMAIL)) die("Нeправильный e-mail"); $this->logMessage .= " \r\n На вашем сайте " . $_SERVER[HTTP_HOST].$_SERVER[PHP_SELF] ; mail($this->adminMail, 'Сообщение об ошибке', $this->logMessage); } } /** * Формирует сообщение дебага */ private function getDebugMessage($errno, $errstr, $errfile, $errline ){ $message = $this->errortype[$errno]." : $errstr в файле $errfile на линии $errline <hr>"; $message .= $this->highlight_num($errfile); $message .= '<hr><small>Массив $_REQUEST:</small><br/>'; $message .= '<pre>' . print_r($_REQUEST, true) .'</pre><hr>'; $message .= '<small>Массив $_COOKIE:</small><br/>'; $message .= '<pre>' . print_r($_COOKIE, true) .'</pre><hr>'; $message .= '<small>Массив $_SESSION:</small><br/>'; $message .= isset($_SESSION)? '<pre>' . print_r($_SESSION, true) .'</pre><hr>' : 'Не задан<hr>'; $message .= '<small>Массив $_FILES:</small><br/>'; $message .= '<pre>' . print_r($_FILES, true) .'</pre><hr>'; $message .= '<small>Массив $_SERVER:</small><br/>'; $message .= '<pre>' . print_r($_SERVER, true) .'</pre><hr>'; return $message; } /** * нумерует строчки php * спизжено с мануала * @param string $file */ private function highlight_num($file) { $lines = implode(range(1, count(file($file))), '<br />'); $content = highlight_file($file, true); $content .=' <style type="text/css"> .num { float: left; color: gray; font-size: 11px; font-family: monospace; text-align: right; margin-right: 3pt; padding-right: 3pt; border-right: 1px solid gray;} body {margin: 0px; margin-left: 3px;} td {vertical-align: top;} code {white-space: nowrap;} span { font-size: 11px; } </style>'; return "<table><tr><td class=\"num\">\n$lines\n</td><td>\n$content\n</td></tr></table>"; } } $errorClass = new Error('error.log', 1, 1); $errorMethod = 'handler'; set_error_handler(array($errorClass, $errorMethod)); //trigger_error('Произошла какая то хуйня !', E_USER_ERROR); 1/0 ?>
Апельсин еше около 12 классов (основных, а еше патерны, интерфейсы и т.п.) будет, если сил и времени хватит и получится 1001 фрейм ворк общего назначения а потом поверх буду строить CMS, еше сверху соц сеть (ты ж сам сказал что кто без соц сети тот лох ) шутко, в пень соц сеть
Padaboo я в коде ошибку нашел. PHP: <?php //trigger_error('Произошла какая то фиг !', E_USER_ERROR); там не хватает "ня" у слова "фиг" )))))))
[vs] а куда ты собрался писать лог, если файл лога не существует, и вообще зачем это во время настройки самого логера
Костян тогда Warning: error_log(error.log) [function.error-log]: failed to open stream хотя трудно такую ситуацию представить, сначала нормально настраиваешь, а потом функция логирования сама вроде как пакует старый файл и создает новый...
Это в идеале. Лучше чтобы класс имел какой-нибудь дефолтный лог-файл (trashcan.log) и если пользовательский файл задан неверно - писал ошибки в него (в т.ч. и ошибку что пользовательский файл задан неверно).
Уже есть: http://dklab.ru/lib/Debug_ErrorHook/ А вот мой велосипед для вывода ошибок в firebug для файрфокса (естественно работает только для html-контента), подключаем в начале основного файла приложения и наслаждаемся: PHP: <?php if (strpos($_SERVER["HTTP_HOST"], "localhost") !== false) { function my_debug_trace($s, $vars=array(), $type="log") { if (!in_array($type, array("info", "warn", "error", "log", "debug"))) return; print "<script>console.$type(" . json_encode((sizeof($vars) > 0 ? ($s . ($type != "log" ? "Local: " : " ") . "%o") : $s)) . (sizeof($vars) > 0 ? "," . json_encode($vars) : "") . ");</script>\n"; } function my_debug_error_handler($errno, $errstr, $errfile, $errline, $vars) { $found_error = false; $errors = array( E_USER_ERROR => "error", E_ERROR => "error", E_USER_WARNING => "warn", E_WARNING => "warn", E_USER_NOTICE => "info", E_NOTICE => "info", E_STRICT => "info"); foreach ($errors as $e => $v) if ($errno == $e) { if (error_reporting() & $e) my_debug_trace("[$errno] $errfile:$errline\n$errstr\n", $vars, $v); $found_error = true; break; } if (!$found_error) my_debug_trace("[$errno] Unknown error - $errfile:$errline\n$errstr\n", $vars, "error"); return false; } set_error_handler("my_debug_error_handler"); function my_debug_exception_handler($e) { my_debug_trace("[" . $e->getCode() . "] " . $e->getFile() . ":" . $e->getLine() . "\n" . $e->getMessage() . "\n", $e->getTrace(), "error"); } set_exception_handler("my_debug_exception_handler"); function my_debug_last_error() { $e = error_get_last(); if (($e["type"] & E_COMPILE_ERROR) || ($e["type"] & E_ERROR) || ($e["type"] & E_CORE_ERROR) || ($e["type"] & E_RECOVERABLE_ERROR)) my_debug_trace("[" . $e["type"] . "] " . $e["file"] . ":" . $e["line"] . "\n" . $e["message"] . "\n", array(), "error"); } register_shutdown_function("my_debug_last_error"); }
конечно, особенно когда есть два сервера ))) у меня например СМС-ки приходят, когда комментарий добавляется и еще там по определённым причинам, только чур ночью не комментировать...
А я даже не стал писать error_handler, потому что меня вполне устраивает лог php. Просто написал класс для записи произвольных ошибок PHP: <?php // Ведение лога class Spirit_Log { private static $logtext = array(); private static function assing($params) { if (Spirit_Registry::getInstance()->config()->DisplayLog() == 1) { echo "\r\n<pre>"; print_r($params); echo "\r\n</pre>"; } $time = date('H:i:s'); $case = 1; while (key_exists($time.'('.$case.')', self::$logtext)) { $case++; } self::$logtext[$time.'('.$case.')'] = $params; } public static function notice($text) { self::assing(array('Level'=>'Notice', 'Text'=>$text)); } public static function warning($text) { self::assing(array('Level'=>'Warning', 'Text'=>$text)); } public static function exception($e) { self::assing(array('Level'=>'Exception', 'Text'=>'Message: '.$e->getMessage(). 'File: '.$e->getFile().', Line: '.$e->getLine() )); } public static function save() { if (empty(self::$logtext) || Spirit_Registry::getInstance()->config()->WriteLog() == 0) { return false; } $text = "\r\nBegin:\r\n"; foreach (self::$logtext as $time=>$record) { $text .= ' '.$time.'::'.$record['Level'].'::'.$record['Text']."\r\n"; } $text .= "Eof;\r\n"; $filename = SPIRIT_PATH.'/Logs/'.date('m_d_Y').'.log'; if (file_exists($filename)) { $fp = fopen($filename, 'a'); fwrite($fp, $text); } else { file_put_contents($filename, $text); } self::$logtext = array(); } } в шатдаун-функции вызывается метод save. Интересная особенность - т.к. в одну секунду может быть выполнено несколько разных скриптов, словами Begin и Eof и отступами разграничиваются сеансы.
Костян А как ты с смс работаешь, если не секрет )) Знаю раньше можно было почту отправить типа 123456789@operator.ru ))
оо, мсье не знает о наличии флага FILE_APPEND у file_put_contents? Код (Text): config()->DisplayLog() не могу понять, чем обусловлен выбор больших и маленьких букв для названия методов. Почему конфиг с маленькой а дисплей лог с большой называется?