За последние 24 часа нас посетили 114888 программистов и 6456 роботов. Сейчас ищут 1543 программиста ...

Буферизация

Тема в разделе "PHP для новичков", создана пользователем !Dron, 3 мар 2015.

  1. !Dron

    !Dron Новичок

    С нами с:
    28 фев 2015
    Сообщения:
    6
    Симпатии:
    0
    Добрый вечер!
    Как с помощью буферизации сделать такое:
    Код (Text):
    1. Буферизация вкл.;
    2. печать чего-либо (например echo "aaaaa");
    3. сохранение того, что было напечатано в переменную $a и опустошение буфера;
    4. печать чего-либо (например echo "bbbbb");
    5. сохранение того, что было напечатано в переменную $b и опустошение буфера;
    6. печать чего-либо (например echo "ccccc");
    7. сохранение того, что было напечатано в переменную $c и опустошение буфера;
    8. ...
    9. буферизация выкл.;
    В итоге должно получиться:
    Код (Text):
    1. $a содержит "aaaaa"
    2. $b содержит "bbbbb"
    3. $c содержит "ccccc"
    В документации куча обов, но при этом ни одна такое не делает... (кроме вкл и выкл буфера)
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.870
    Симпатии:
    955
    глазки протереть наверное надо перед тем как в мануал залезать :D
    всё есть и более того - названия функций сами за себя говорят.
     
  3. !Dron

    !Dron Новичок

    С нами с:
    28 фев 2015
    Сообщения:
    6
    Симпатии:
    0
    Если, вы такой умный, что ж пример-то не написали? Форум зачем сделали?
    И хватит писать пустые не содержащие никакой информации сообщения.
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    !Dron давай я за тебя погуглю: буферизация вывода php
    А в третьей ссылки даже есть примеры для тебя https://php.net/manual/ru/function.ob-start.php#refsect1-fu ... t-examples
    слабо один раз прочитать всю документацию, чтобы знать о возможностях php
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.870
    Симпатии:
    955
    !Dron, я вижу что ты дерзкий. но ты лучше покажи что ты умный.

    Добавлено спустя 4 минуты 43 секунды:
    перед вы не нужно запятой. форум сделали для общения. а мануал сделали для получения информации. ты прекрасно демонстрируешь уровень своего развития - тебе проще спросить на форуме чтоб тебе дали 4 имени функций чем пойти почитать мануал. аутист....

    хватит на форумах просить перепечатать мануал. иди читай первоисточник. не можешь прочитать? не понимаешь материал? не занимайся тогда программированием. вообще.
     
    SamyRed нравится это.
  6. !Dron

    !Dron Новичок

    С нами с:
    28 фев 2015
    Сообщения:
    6
    Симпатии:
    0
    Это можно было написать во втором посте. И ВСЕ!
    Не стоит, друг мой, быть столь гордым и высокомерным. Тебя спросили о помощи тихо и нормально. Ты же в ответ нагрубил, хотя мог просто сделать цитату и также красным шрифтом вставить названия функций. Я тебя спросил: умный значит? Так напиши и докажи, что умный. А по поводу бесполезности твоего второго поста ты и сам знаешь - он никакой смысловой нагрузки не несет и никакой информации в нем нет.
    Ты лучше ешь, но людей не ешь (с)
    denis01, и к тебе друг тоже относится.
    Самое забавное, что в реальной жизни вы так не ведете себя, потому что там могут запросто отвесить леща. А здесь можно похамить, потому что защищен километрами и лица твоего никто не видит.
    Беда...
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.870
    Симпатии:
    955
    это я тебе нагрубил? разуй глаза - там в сообщении есть смайлик сообщающий о дружелюбном настрое. я своим сообщением хотел чтоб ты сам не боялся почитать мануал ведь в нем все невероятно просто. ты же своими нападками лишь продемонстрировал что этот слишком простой уровень слишком сложен для тебя. и тебе важнее показать как ты умеешь огрызаться на людей которые тебе пытаются помочь. даже не извинился. ох.
     
    rishard нравится это.
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    !Dron я всегда стебу людей в реале и все позитивно к этому относятся, мы же позитивно помогаем и советы серьёзные/правильные даём, а ты сам решаешь как к этому относиться
     
  9. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Начал изучать буферизацию и вообще плохо её понимаю.

    Сначала всё попадает в буфер, обрабатывается и только потом выводится?

    PHP:
    1. <?php
    2.  
    3.  
    4. echo 'Hello<br>';
    5. echo 'Hello<br>';
    6. echo 'Hello<br>';
    7. echo 'Hello<br>';
    8. echo 'Hello<br>';
    9. echo 'Hello<br>';
    10. echo 'Hello<br>';
    11. echo 'Hello<br>';
    12.  
    13. $content = ob_get_contents();
    14.  
    15.  
    16. $content = strtr($content, 'o', 'O');
    17.  
    18. echo $content;
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Гляди, буферизация это просто. Когда ты делаешь очередное echo, то, по идее, PHP сразу выплевывает данные оттуда клиенту. Если же перед этим был открыт буфер, данные кладутся туда. Как в коробочку. Потом ты можешь их оттуда забрать, а сам буфер закрыть. Или не закрывать, как хочешь. А можешь открыть несколько буферов, и тогда они будут вложенные.

    Это как бы промежуточный карман между тобой и клиентом, в который ты можешь залезть, если надо. Это действительно очень простой механизм, не надо пугаться слова "буферизация", демонизировать его и усложнять в своем восприятии.

    В случае, который ты привел да, все echo отдают контент не клиенту, а кладут в буфер. После чего мы оттуда это достаем как обычный текст, делаем что-то, а потом решаем, куда девать дальше. Например - уже реально клиенту отдать.
     
    Dimon2x нравится это.
  11. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    @Fell-x27 а а каких случаях, её чаще используют?
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Буферизация крайне удобна, например, когда тебе надо сгенерить большой HTML внутри функции, которая должна его вернуть.
    Мне вот влом, в таких случаях, возиться со строками пхпшными. Мне проще закрыть пхп-тег, переключив выполнение в html-режим. А потом открыть пхп-тег в конце. Если перед этим был открыт буфер, то все данные в html-режиме упадут туда. После чего я могу сделать return ob_get_clean(). Красиво, изящно, IDE-френдли.

    Ну и самый главный плюс использования буферизации - буферы не собирают заголовки. Только контент. По этому, если в начале кода у тебя стоит одинокий ob_start(), проблема с ошибкой "headers already sent" у тебя будет решена раз и навсегда. Вообще.

    Для такого случая в конфиге PHP есть даже параметр, отвечающий за автоматическое включение буферизации.

    Но есть и теневая сторона вопроса. Если ты с помощью PHP отдаешь какие-то файлы, или поток вещаешь, то буферизацию нужно обязательно выключать. Потому что в таком случае ты будешь вещать не клиенту, а в буфер. Если данных немного, то, по завершению работы, сервер все равно их отправит клиенту и проблема будет незаметна. А вот если вещается что-то крупное, у тебя может оперативная память кончиться раньше :D
     
    Dimon2x нравится это.
  13. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.294
    Симпатии:
    216
    Адрес:
    Default city
    Архитектура битрикса построена на буферизации, кстати. Не говорю что это хороший тон, но поставленные проблемы решает. Типа отложенного выполнения.
     
  14. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    @Fell-x27 буферы не собирают заголовки

    Тогда почему, если сделать так

    PHP:
    1. <?php
    2. {
    3. echo "hello world";
    4. $content = ob_get_contents();
    5. header('Location: /');
    6. }
    7.  
    8. echo "<h1>".$content."</h1>";
    Перенаправление работает?
     
  15. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    656
    А почему не должно? Контент пишется только в буфер.

    Даже если закрыть буфер перед вторым echo, все равно будет норм. После Location выводить контент допустимо, перед нет.
     
  16. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Почему повторяется слово hello? Что нужно добавить, что бы нормально вывело hello world?

    PHP:
    1. <?php
    2.  
    3. {
    4.     echo "hello";
    5.     $a = ob_get_contents();
    6.     echo "world";
    7.     $b = ob_get_contents();
    8. }
    9.  
    10. echo $a .' '. $b;
     
  17. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    656
    Тебе уже выше объяснили. Пока буфер жив, это все равно что временная переменная.
    Код (Text):
    1.  
    2. $tmp='hello';
    3. $a=$tmp;
    4. $tmp.='world';
    5. $b=$tmp;
    6. ...
     
  18. rishard

    rishard Новичок

    С нами с:
    20 сен 2016
    Сообщения:
    228
    Симпатии:
    27

    Найдите ошибку в логике.

    Тезы:

    1. denis01 всегда стебет людей в реале и все позитивно к этому относятся.
    2. denis01 программист.
    3. 85% лексикона программистов - функции и регулярки.
    4. 98% людей не понимают сленга и манеры общения программистов, 97.9% эти самые сленг и манера дико раздражают, пример чуть выше.

    Вывод:

    @denis01 в реале весит от 120 кг, рост 190, и его улыбка вызывает у людей позитивные ностальгические воспоминания об обаянии молодого Шварценеггера.

    P.S. На всякий случай дружелюбный смайлик :)
    P.P.S :p:p:p
     
    romach нравится это.
  19. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
  20. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Помогите пожалуйста сделать простой шаблонизатор, на основе ob_start

    Есть такая заготовка

    PHP:
    1. $header = template('header', ['title' => 'Hello World!']);
    2. $content = template('content', ['content' => "Lorem ipsum...", 'meta' => 'Author info']);
    3. $footer = template('footer', ['copy' => "Copyright ". date('Y')]);
    4.  
    5. // ...skipped logic
    6.  
    7. echo $header, $content, $footer;
    8.  
    9. /**
    10. * @param  string $template
    11. * @param  array  $vars
    12. * @return string
    13. */
    14. function template($template, $vars) {
    15.     // place your code here
    16.     // ...
    17. }
    Нужно что бы работало так

    PHP:
    1. !-- header.phtml -->
    2. <!DOCTYPE html>
    3. <html lang="en">
    4. <head>
    5.     <meta charset="utf-8">
    6.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
    7.     <meta name="viewport" content="width=device-width, initial-scale=1">
    8.     <title><?=$title?></title>
    9. </head>
    10. <body>
    11. <!-- content.phtml -->
    12. <div class="container">
    13.     <p><?=$content?></p>
    14.     <p><?=$meta?></p>
    15. </div>
    16. <!-- footer.phtml -->
    17. <footer>
    18.     <?=$copy?>
    19. </footer>
    20. </body>
    21. </html>
    Вообще не понимаю, как это сделать или покидайте ссылки, что бы я изучил нужные статьи.
     
  21. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.601
    Симпатии:
    423
    Адрес:
    РД, г. Махачкала.
    @Dimon2x, выбери шаблонизатор, и лезь под "капот".
     
  22. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    PHP:
    1. function template($template, $vars) {
    2.     extract($vars);
    3.     ob_start();
    4.     require $template;
    5.     return ob_get_clean();
    6. }
     
    Dimon2x и mkramer нравится это.
  23. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    @ElisDN Потом попробую