В перерывах между безделием надумалась такая вещь: мне лично иногда по запарке, редко, но вот тупо лень искать на каком этапе скрипта нужно активировать буферизацию - ob_start(), поэтому я просто не стартую её там, где это не очень понятно, НО я знаю где мне нужно сбросить буфер (иначе возникает некоторая каша с некоторым отображением), применяется ob_end_clean(), но тут возникает ошибка - очистка буфера при неактивной буферизации и для её избежания там я делаю некоторый финт с дополнительным ob_start() в классе, где используется очистка. Читаю функцию ob_get_length() - Возвращает размер в байтах содержимого буфера вывода или false, если буферизация не активна. Очень стало интересно, сделал так: Код (Text): error_reporting(-1); // дебажим, затребует ли ob_start() if (ob_get_length()) ob_end_clean(); // никаких ошибок Вопрос: Я правильно понял, что при использовании функции ob_get_length() для такой проверки перед очисткой, включать буферизацию по месту применения очистки не нужно? То есть такая проверка в любом случае отработает без ошибок, включили мы где-то буфер или нет, правильно? Мне нужно просто не получать ошибку, что я делаю чистку незапущенного буфера. Я почему спрашиваю, потому что в документации по ob_get_length() дан пример и в нём есть ob_start(), но там и нет такого именно примера на проверку.
ты правильно понял смысл +++ но я поэтому и спрашиваю: я делаю очистку перед выводом другого контента, ИНАЧЕ вот это и произойдёт - смешивание, поэтому чтобы не было ошибки пытаюсь проверить его наличие буфера этого короче у меня глобальный обработчик ошибок стартует РАНЬШЕ приложения, если в приложении ошибка, то подключается вид обработчика ошибок и чтобы мне не выводило кашу вид+вид обработчика, то я чищу буфер, но тогда ошибка, что я чищу неактивный буфер)))) поэтому я дополнительно в обработчике запускаю его ))) хочу избавиться от дополнительного запуска, такая проверка как я понял не затребует его активировать, правильно?
я особо не понял тебя. Если у нас в скрипте происходит где-то ошибка, то я так понимаю - ты не хочешь чтобы мешало ошибку с остальным контентом. Тогда смотри в сторону https://www.php.net/manual/ru/function.error-get-last.php --- Добавлено --- если есть ошибка, то вывести в переменную - а буфер очистить ! --- Добавлено --- Иначе по окончанию скрипта, буфер все равно выдаст, не важно ( использовал ли вывод из буфера или нет ) --- Добавлено --- Но сама логика кода отработает если будут игноры/обработки ошибок
ну тут не очень ты понял, дам для наглядности Спойлер: В комментариях к коду суть вопроса PHP: <?php namespace core; use Throwable; class Debug { public static function run() { ob_start(); // ХОЧУ УБРАТЬ ВОТ ЭТО // Но тогда будет ошибка ob_end_clean() ниже в методе displayError :) set_error_handler([self::class, 'errorHandler']); set_exception_handler([self::class, 'exceptionHandler']); register_shutdown_function([self::class, 'uncaughtErrorHandler']); } public static function errorHandler($code, $text, $file, $line) { self::displayError('Ошибка', $code, $text, $file, $line); } private static function displayError($head, $code, $text, $file, $line) { ob_end_clean(); // И ВОТ ТУТ СДЕЛАТЬ if (ob_get_length()) ob_end_clean(); // Удаляем буфер, в котором вьюха ПРИЛОЖЕНИЯ и избавляемся от ошибки, что нету ob_start() :) if ($code != 404) { $code = 500; } http_response_code($code); if (App::$debug) { require_once 'app/views/layouts/errors/displayError.php'; } else { self::logError($head, $code, $text, $file, $line); require_once "app/views/layouts/errors/{$code}.html"; } die(); } private static function logError($head, $code, $text, $file, $line) { $date = date('d-m-Y'); $time = date('H:i:s'); $bash = str_repeat('-', 120); $log_text = "[{$time} - {$head}]\nТекст: {$text}\nФайл: {$file}\nСтрока: {$line}\n{$bash}\n"; $log_file = "tmp/errors/{$code}/{$date}.log"; error_log($log_text, 3, $log_file); } public static function exceptionHandler(Throwable $e) { self::displayError('Исключение', $e->getCode(), $e->getMessage(), $e->getFile(), $e->getLine()); } public static function uncaughtErrorHandler() { $e = error_get_last(); if ($e) { self::displayError('Неперехваченная ошибка', $e['type'], $e['message'], $e['file'], $e['line']); } } } надеюсь так будет понятно
блин, нужна в данном конкретном случае, если отработает register_shutdown_function, то в подключаемый вид обработчика ошибок попадёт стандартный вывод ошибки самого php, поэтому нужно оставить как есть: кидать всё в буфер обработчика, независимо от остальных буферов и потом чистить перед выводом ошибки обработчиком... решено