Нужна ли ob_start() при использовании ob_get_length()?

Вероломство

В перерывах между безделием надумалась такая вещь: мне лично иногда по запарке, редко, но вот тупо лень искать на каком этапе скрипта нужно активировать буферизацию — ob_start(), поэтому я просто не стартую её там, где это не очень понятно, НО я знаю где мне нужно сбросить буфер (иначе возникает некоторая каша с некоторым отображением), применяется ob_end_clean(), но тут возникает ошибка — очистка буфера при неактивной буферизации и для её избежания там я делаю некоторый финт с дополнительным ob_start() в классе, где используется очистка.

Читаю функцию ob_get_length() — Возвращает размер в байтах содержимого буфера вывода или false, если буферизация не активна.

Очень стало интересно, сделал так:

Код (Text):
  1. error_reporting(-1); // дебажим, затребует ли ob_start()
  2. if (ob_get_length()) ob_end_clean(); // никаких ошибок

Вопрос: Я правильно понял, что при использовании функции ob_get_length() для такой проверки перед очисткой, включать буферизацию по месту применения очистки не нужно?

То есть такая проверка в любом случае отработает без ошибок, включили мы где-то буфер или нет, правильно? Мне нужно просто не получать ошибку, что я делаю чистку незапущенного буфера. :)

Я почему спрашиваю, потому что в документации по ob_get_length() дан пример и в нём есть ob_start(), но там и нет такого именно примера на проверку.

 

MouseZver

Обязательно, иначе как контент в буфер будет попадать.

 

Вероломство

ты правильно понял смысл +++

но я поэтому и спрашиваю: я делаю очистку перед выводом другого контента, ИНАЧЕ вот это и произойдёт — смешивание, поэтому чтобы не было ошибки пытаюсь проверить его наличие буфера этого

короче у меня глобальный обработчик ошибок стартует РАНЬШЕ приложения, если в приложении ошибка, то подключается вид обработчика ошибок и чтобы мне не выводило кашу вид+вид обработчика, то я чищу буфер, но тогда ошибка, что я чищу неактивный буфер)))) поэтому я дополнительно в обработчике запускаю его )))

хочу избавиться от дополнительного запуска, такая проверка как я понял не затребует его активировать, правильно?

 

MouseZver

я особо не понял тебя.
Если у нас в скрипте происходит где-то ошибка, то я так понимаю — ты не хочешь чтобы мешало ошибку с остальным контентом. Тогда смотри в сторону https://www.php.net/manual/ru/function.error-get-last.php
— Добавлено —
если есть ошибка, то вывести в переменную — а буфер очистить !
— Добавлено —
Иначе по окончанию скрипта, буфер все равно выдаст, не важно ( использовал ли вывод из буфера или нет )
— Добавлено —
Но сама логика кода отработает если будут игноры/обработки ошибок

 

Вероломство

ну тут не очень ты понял, дам для наглядности

PHP:
  1. <?php
  2.  
  3.  
  4. namespace core;
  5.  
  6.  
  7. use Throwable;
  8.  
  9. class Debug
  10. {
  11.     public static function run()
  12.     {
  13.         ob_start(); // ХОЧУ УБРАТЬ ВОТ ЭТО
  14.         // Но тогда будет ошибка ob_end_clean() ниже в методе displayError 🙂
  15.         set_error_handler([self::class, ‘errorHandler’]);
  16.         set_exception_handler([self::class, ‘exceptionHandler’]);
  17.         register_shutdown_function([self::class, ‘uncaughtErrorHandler’]);
  18.     }
  19.  
  20.     public static function errorHandler($code, $text, $file, $line)
  21.     {
  22.         self::displayError(‘Ошибка’, $code, $text, $file, $line);
  23.     }
  24.  
  25.     private static function displayError($head, $code, $text, $file, $line)
  26.     {
  27.         ob_end_clean(); // И ВОТ ТУТ СДЕЛАТЬ if (ob_get_length()) ob_end_clean();
  28.         // Удаляем буфер, в котором вьюха ПРИЛОЖЕНИЯ и избавляемся от ошибки, что нету ob_start() 🙂
  29.         if ($code != 404) {
  30.             $code = 500;
  31.         }
  32.         http_response_code($code);
  33.         if (App::$debug) {
  34.             require_once ‘app/views/layouts/errors/displayError.php’;
  35.         } else {
  36.             self::logError($head, $code, $text, $file, $line);
  37.             require_once «app/views/layouts/errors/{$code}.html»;
  38.         }
  39.         die();
  40.     }
  41.  
  42.     private static function logError($head, $code, $text, $file, $line)
  43.     {
  44.         $date = date(‘d-m-Y’);
  45.         $time = date(‘H:i:s’);
  46.         $bash = str_repeat(‘-‘, 120);
  47.         $log_text = «[{$time}{$head}]nТекст: {$text}nФайл: {$file}nСтрока: {$line}n{$bash}n«;
  48.         $log_file = «tmp/errors/{$code}/{$date}.log»;
  49.         error_log($log_text, 3, $log_file);
  50.     }
  51.  
  52.     public static function exceptionHandler(Throwable $e)
  53.     {
  54.         self::displayError(‘Исключение’, $e->getCode(), $e->getMessage(), $e->getFile(), $e->getLine());
  55.     }
  56.  
  57.     public static function uncaughtErrorHandler()
  58.     {
  59.         $e = error_get_last();
  60.         if ($e) {
  61.             self::displayError(‘Неперехваченная ошибка’, $e[‘type’], $e[‘message’], $e[‘file’], $e[‘line’]);
  62.         }
  63.     }
  64. }

надеюсь так будет понятно

 

Вероломство

не нужна, отбой

 

Вероломство

блин, нужна :)

в данном конкретном случае, если отработает register_shutdown_function, то в подключаемый вид обработчика ошибок попадёт стандартный вывод ошибки самого php, поэтому нужно оставить как есть: кидать всё в буфер обработчика, независимо от остальных буферов и потом чистить перед выводом ошибки обработчиком…

решено

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *