За последние 24 часа нас посетили 21990 программистов и 1103 робота. Сейчас ищет 731 программист ...

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

Тема в разделе "PHP для новичков", создана пользователем Вероломство, 16 янв 2021.

Метки:
  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    В перерывах между безделием надумалась такая вещь: мне лично иногда по запарке, редко, но вот тупо лень искать на каком этапе скрипта нужно активировать буферизацию - 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(), но там и нет такого именно примера на проверку.
     
    #1 Вероломство, 16 янв 2021
    Последнее редактирование: 16 янв 2021
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    Обязательно, иначе как контент в буфер будет попадать.
     
    Вероломство нравится это.
  3. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    ты правильно понял смысл +++

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

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

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

    MouseZver Суперстар

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

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    ну тут не очень ты понял, дам для наглядности

    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. }

    надеюсь так будет понятно
     
    #5 Вероломство, 16 янв 2021
    Последнее редактирование: 16 янв 2021
  6. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    не нужна, отбой
     
  7. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    блин, нужна :)

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

    решено