2012-02-17 2 views

ответ

9

Это не возможно обрабатывать фатальные ошибки с помощью обработчика ошибок.

Лучшее решение - просто включить ведение журнала ошибок (например, в syslog) в php.ini, а затем с помощью инструмента, такого как logcheck/logsentry, для получения регулярных сообщений о необычных записях syslog.
Вместо syslog PHP также может регистрировать ошибки в файле - просто просмотрите параметры регистрации ошибок php.ini.

log_errors = On 
error_log = syslog 
error_log = /path/to/some/folder/phperrors.log 

Очевидно, что вы хотите использовать только одну из error_log линий.

+0

как я могу включить журнал ошибок в php.ini? – Hamidreza

+0

Вы должны иметь возможность обрабатывать фатальную ошибку с помощью register_shutdown_function() –

+0

@ SebastiánGrignoli: нет чистого способа определить, была ли ошибка в этой функции. – ThiefMaster

0

Что-то вроде:

if(!method_exists($obj, 'method')){ 

    $db->log('What you want to log'); //log in your DB 
    error_log('message');//Write to php's error log 

} 
+0

У меня есть обработчик ошибок для обработки мою ошибку, но некоторые ошибки как выше, я не мог справиться их или журнала. – Hamidreza

+0

Ух, я уверен, что он хочет получить общее решение. – ThiefMaster

+0

Я не знаю, где эта ошибка. Мне нужно регистрировать все ошибки типа – Hamidreza

1

Вы можете иметь всю вашу базы классов принадлежат к супер-классу с использованием method overloading:

class Base 
{ 
    public function __call($name) 
    { 
     MyLog::logError(...); 
     trigger_error("Function ".get_class($this)."::$name doesn't exist", 
      E_USER_ERROR); 
    } 
} 

Попыток взывают несуществующие методы классов, производные от Base будут в конечном счете, обрабатываемые Base::__call(). Для статических методов, соответственно, есть __callStatic() (начиная с PHP 5.3).

6

Существует способ справиться с вашей задачей, и на самом деле вы можете установить собственный обработчик ошибок при ошибках FATAL.

Вы можете сделать это следующим образом:

ini_set('error_reporting', E_ERROR); 
register_shutdown_function("fatal_handler"); 
function fatal_handler() { 
    $error = error_get_last(); 
    //Do whatever you want with this error, for example: 
    YourDBApplicationLayer::writeFatal($error); 
} 
0

теперь его в PHP7 возможно

try { 

    ggggg(); // <---- make fatal error 

}catch(Error $e){ 

    var_dump($e); 

}