<?
class ErrorSupervisor
{
	public function __construct()
	{
		// регистрация ошибок
		set_error_handler(array($this, 'OtherErrorCatcher'));
		
		// перехват критических ошибок
		register_shutdown_function(array($this, 'FatalErrorCatcher'));
		
		// создание буфера вывода
		ob_start();
	}
	
	public function OtherErrorCatcher($errno, $errstr)
	{
		// контроль ошибок:
		// - записать в лог
		return false;
	}
	
	public function FatalErrorCatcher() {
		GLOBAL $log;
		
		$error = error_get_last();
		if (isset($error))
			if($error['type'] == E_ERROR
				|| $error['type'] == E_PARSE
				|| $error['type'] == E_COMPILE_ERROR
				|| $error['type'] == E_CORE_ERROR)
			{
				//ob_end_clean();	// сбросить буфер, завершить работу буфера
				$log->line(ob_get_clean());
				
			
				// контроль критических ошибок:
				// - записать в лог
				// - вернуть заголовок 500
				// - вернуть после заголовка данные для пользователя
			}
			else
			{
				//ob_end_flush();	// вывод буфера, завершить работу буфера
				$log->line(ob_get_flush());
			}
		else
		{
			//ob_end_flush();	// вывод буфера, завершить работу буфера
			$log->line(ob_get_flush());
		}
	}
}

/*

// запуск контроллера
$errorController = new ErrorSupervisor();

// генерируем контент
// изменяем заголовки, в обещм делаем много чего
echo "генерация простейшего контента";

// тестируем систему (не тестировал, но у меня в более сложном варианте работает)
include 'null'; // запускается OtherErrorCatcher
// require 'null'; // запустится FatalErrorCatcher
// require 'foobar.php'; // а внутри этого файла вообще ошибка компиляции

$_e = err_status(false); // отключаем ошибки

// код с ошибкой
   if (err_last()){
     // произошла ошибки
   }

err_status($_e); // возвращаем статус  

*/

?>