За последние 24 часа нас посетили 22677 программистов и 1281 робот. Сейчас ищет 741 программист ...

Буферизация вывода и быстрые шаблоны

Тема в разделе "PHP для новичков", создана пользователем 440Hz, 11 авг 2006.

  1. virabhadra

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

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    У меня есть один технический вопрос, по поводу вывода...
    РНР генерит код и отсылает его броузеру клиента, как я понял из комментариев пакетно. Мне теперь непонятно, влияет ли вывод html-структуры на страницу броузера на скорость передачи рнр-кода?
    Т.е. жде:т ли рнр-обработчик в каком-либо случае, пока не будет выведен html-код или ему все: до фени, а что там броузер с html делает, так это его проблемы?

    (Ну я не беру косвенные варианты, когда броузер в данный момент со второй страницы, но с этого же сервера грузит какую-нибудь большую картинку и по-этому тормозится передача рнр)
     
  2. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    PHP до фени
     
  3. virabhadra

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

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    Это хорошо :)
     
  4. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Когда пишу для себя, то сочетаю два вида шаблонов: статические и динамические. Статический для глобального шаблона и динамические для разных блоков: меню, модули и т.п. Динамические шаблоны пишу на PHP. По-моему удобно.
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    это как? пример в студию!
     
  6. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Это имеется ввиду HTML код с PHP вставками. Чем не динамические шаблоны? ;)
     
  7. Vell

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

    С нами с:
    8 окт 2006
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Таганрог
    народ зацените,написал запару вечеров не спешной работы,пока еще не описана ожна функция но и без нее пока можно обойтись.

    index.php
    PHP:
    1. <?php
    2.  
    3. // standard hack prevent
    4. define('IN_PHPBB', true);
    5. $phpbb_root_path = './';
    6. $phpEx="php";
    7. include($phpbb_root_path . 'includes/template.'.$phpEx);
    8.  
    9. $puth="./tpl";
    10. $template->cahge_dir($puth);
    11. $puth_file='qwe.tpl';
    12. $template->load_tpl ($puth_file);
    13.  
    14. for($fx=1; $fx <=7; $fx++)
    15.     {
    16.          $template->assign_block_vars('blok1', array
    17.                                 ( 'per1' => $fx,
    18.                                  'TOTAL_USERS' => '<b>привет</b><b>привет</b><br><b>привет</b> <b>привет</b>',
    19.  
    20.                                  )
    21.                                 );
    22.  
    23.      }
    24.   $template->assign_block_vars('blok2', array
    25.                                 ( 'per1' => "<b>вавапивапва амвам вафмывами dzf sfd вам ва</b>",
    26.                                  'TOTAL_USERS' => '<b>привет</b>',
    27.                                   'per3'=> '<b>привет</b><b>привет</b> <b>привет</b><b>привет</b>',
    28.                                  )
    29.                                 );
    30.  
    31. $template->parse('0');
    32. ?>
    template.php
    PHP:
    1. <?php
    2. $template = new template;
    3.  class template
    4.   {
    5.   var $text;
    6.   var $bodytag;
    7.   var $edit_text;
    8.   var $itog_txt=array();
    9.   var $all_block=array();
    10.     function cahge_dir ($puth)
    11.      {
    12.       chdir($puth);
    13.      }
    14.  
    15.  
    16.     function load_tpl ($puth_file)
    17.      {  global $text;
    18.         $this->text = implode ('', file ($puth_file));
    19.         //echo $text;
    20.         return true;
    21.      }
    22.  
    23.  
    24.     function assign_block_vars ($blockname, $vararray)
    25.      {
    26.      preg_match("/((?:<!\-\- BEGIN $blockname \-\->)[^`]*(?:<!\-\- END $blockname \-\->))/", $this->text, $this->bodytag);
    27.  
    28.      $string= $this->bodytag[0];
    29.      foreach($vararray as $key=>$value)
    30.         {
    31.         $pattern="/(?:\{$blockname.){1}(?:$key){1}(?:\}){1}/";
    32.         preg_match($pattern,$string,$this->edit_text);
    33.         //echo $this->edit_text[0].'<br>';
    34.         $replacement= $value;
    35.         $string=preg_replace($pattern, $replacement, $string);
    36.  
    37.         }
    38.         $pattern="/(?:\{$blockname.){1}(?:[A-Za-z0-9])*(?:\}){1}/";
    39.         $replacement='';
    40.         $string=preg_replace($pattern, $replacement, $string);
    41.  
    42.      // echo htmlspecialchars  ($string)."<br><br>";
    43.            $pattern="/(?:<!\-\- BEGIN $blockname \-\->)/";
    44.      $replacement= "";
    45.      $string =preg_replace($pattern, $replacement,$string );
    46.  
    47.       $pattern="/(?:<!\-\- END $blockname \-\->)/";
    48.      $replacement= "";
    49.      $string =preg_replace($pattern, $replacement,$string );
    50.  
    51.       $this->itog_str=$string.$this->bodytag[0];
    52.  
    53.       //echo   ( $this->itog_str);
    54.  
    55.  
    56.       $pattern="/((?:<!\-\- BEGIN $blockname \-\->)[^`]*(?:<!\-\- END $blockname \-\->))/";
    57.      $replacement= $this->itog_str;
    58.       $this->text =preg_replace($pattern, $replacement, $this->text);
    59.  
    60.      $this->all_block[]=$blockname;
    61.      }
    62.  
    63.     function parse ($puth_file)
    64.      {
    65.      //$pattern="/(?:<!\-\- BEGIN )[a-zA-Z0-9]*( \-\->)[^`]*((?:<!\-\- END )[a-zA-Z0-9]*( \-\->))(?!\w)/";
    66.      //$replacement= "";
    67.      //preg_match($pattern,$this->text,$navis);
    68.       //$this->text =preg_replace($pattern, $replacement, $this->text);
    69.        foreach($this->all_block as $ke=>$va)
    70.        {
    71.        $pattern="/((?:<!\-\- BEGIN $va \-\->)[^`]*(?:<!\-\- END $va \-\->))/";
    72.        $replacement= "";
    73.        $this->text =preg_replace($pattern, $replacement, $this->text);
    74.        }
    75.  
    76.  
    77.      echo $this->text;
    78.      }
    79.   }
    80.  
    81.  
    82. ?>
    а вот так выглядит шаблон
    Код (Text):
    1. привает  ккака    <br>
    2. <!-- BEGIN blok1 -->
    3. ла орапиоиы {blok1.per1} оаиоыаиыолав  {blok1.TOTAL_USERS}    <br>
    4. <!-- END blok1 -->
    5. vuvuvu  <br>
    6. <!-- BEGIN blok2 -->
    7. ла орапиоиы {blok2.per1} оаиоыаи{blok2.per3}ыолав  {blok2.TOTAL_USERS}    <br>
    8. <!-- END blok2 -->
    9. hvhjvj ggvyuvuyv yvu   yuv  <br>
    что скажите? слишком топорно? я впрограмировании не силен, да и опыта большого нету :(
     
  8. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Vell
    Я как-то давно делал что-то подобное, но потом выяснилось что это даже не велосипед, это изобретение квадратного-колеса :)

    Оффтоп: Петр, я не шаромётчик, просто модератор на форуме шаромётчиков, анимешников и оверклокеров в одном флаконе... (познакомился с пацанами на почве оверклокинга)
     
  9. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а я, как ярый сторонник принципа KISS, предложу вам следующий вариант:
    PHP:
    1. <?php
    2.  
    3. # $name - имя файла скрипта или относительный путь к нему;
    4. # без расширения - оно будет добавлено автоматически
    5. # $var - выходные данные
    6. # выходные данные возвращаются из вызываемого скрипта
    7. # функцией returm
    8. # пример:
    9. #   $menu= inc ('menu/all', $current_path);
    10. function inc ($name, $var=NULL) {
    11.     return include ('./inc/'.$name.'.inc');
    12. }
    13.  
    14. # $name - имя файла темплейта или относительный путь к нему;
    15. # без расширения - оно будет добавлено автоматически
    16. # $var - входные данные
    17. # вывод из темплейта записывается в строку, которая и
    18. # возвращается  функцией
    19. # пример:
    20. #   echo out ('menu/leftblock', $menu);
    21. function out ($name, $var=NULL) {
    22.     ob_start();
    23.         include ('./out/'.$name.'.out');
    24.         $out= ob_get_contents();
    25.     ob_end_clean();
    26.     return $out;
    27. }
    28.  
    29. # пример использования
    30. $goods= inc('goods', $vendor);
    31. echo $nav= out('nav', $goods);
    32. echo out('goods/list', $goods);
    33. echo $nav;
    34.  
    35. ?>
     
  10. Anonymous

    Anonymous Guest

    dark-demon, имхо, тут обратный эффект =)
    Выбирать в буфер то, что можно просто заинклудить при таком раскладе. =)
    Keep it simple...
     
  11. xak2

    xak2 Guest

    А вот такой вопрос:
    Есть шаблон, я его обрабатываю:
    PHP:
    1. <?php
    2. $template = new Buffer();
    3.  
    4. $template->SendFile("Templates/Index.html");
    5.  
    6. $template->Parse();
    7. $template->Show();
    8. ?>
    Допустим.
    Но у меня есть этот шаблон раньчше состоял из многих файлах внутри этого шаблона, например левый фланг был разбит на блоки и инклудились.
    Как мне это сделать в шаблоне?

    Я написал дополнительныцю функцию
    function FileInclude($filename) {
    $this->buffer = include $filename;
    }
    Но как сделать чтобы файл modules/module.php автоматически вставлялся в {include.module} например.
     
  12. virabhadra

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

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    xak2, можешь попробывать замену, т.е.:
    PHP:
    1.  
    2. <?php
    3. $filename = "template.html";
    4. $handle = fopen($filename, "r");
    5. $contents_template = fread($handle, filesize($filename));
    6. fclose($handle);
    7.  
    8. $seznam = glob('modules/*.php');
    9. foreach($seznam as $v)
    10. {
    11.     $handle = fopen($v, "r");
    12.     $contents = fread($handle, filesize($v));
    13.     fclose($handle);
    14.     $contents_template = str_replace('{include.'.basename($v, '.php').'}', $contents, $contents_template);
    15. }
    16.  
    17. echo $contents_template;
    18. ?>
     
  13. Aleksforum

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

    С нами с:
    4 май 2007
    Сообщения:
    8
    Симпатии:
    0
    Я написал движок на ПХП и теперь мучаюсь с тем, что что-то я неправильно написал т.к. делал его в тепличных условиях.

    Движок с использованием шаблонов написанный на псевдо ООП хранящий данные в mysql.
    Шаблоны хранятся в таблицы mysql одной строкой со вставками, по типу как тут написали пример.
    В начале функция загружает инклудом все модули из папки /modules/ которые и создают новые объекты страницы.
    Далее парсер просматривает шаблон и запускает обработку модулей на выполнение и потом всё это дело собирается и выводится на экран.

    Вставки по типу <!- news --> заменяются кодом сгенерированным модулем-классом новостей.

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

    Вообще меня мучает, то что я хотел его сделать на ООП, а вышло то что и было тока взгляд с северо-востока ;)

    К примеру я не могу понять, то что если сделать страницу объектом то выходит что у каждой страницы должна быть своя таблица в базе т.к. все страницы чуток разные, одна с новостями другая там ещё с чем то?

    Как загружать информацию в созданный объект страницы из базы?

    Короче есть ли у кого примеры или идеи движка на ООП с хранением данных в mysql?
     
  14. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    очень за Вас рад
     
  15. Aleksforum

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

    С нами с:
    4 май 2007
    Сообщения:
    8
    Симпатии:
    0
    Мне кажется следующий ваш пост будет предложить мне Смарту...

    Но если можно, то помогите более конкретно т.к. мне он не нужен.
     
  16. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    пойти это дело отметить?
    кто? Smarty или Ваш движок? :)

    а какую помощь Вы ожидали?
     
  17. Davil

    Davil Guest

    на такие вопросы обычно напрашиваются 3 варианта ответа.
    1. Выпить йаду.
    2. Убиться ап стену.
    3. Учить албанский.
     
  18. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Aleksforum
    Написать хороший шаблонизатор не так-то просто... особенно если вам нужны вкусности типа инклюдов, оберток и пр.
    Посмотрите, как реализован шаблонизатор в моем движке. Это не смарти, и он достаточно мощный.
    Движок фришный, так что можете брать что хотите из него для своих разработок.
     
  19. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Aleksforum, а почему шаблоны должны обязательно храниться в mysql?
     
  20. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Согласен с dark-demon... немного глуповато делать допдействие при создании шаблона - его запихивание в БД... кстати зачем он там??? а картинки вы тоже в БД пихаете?
     
  21. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Ganzal
    А почему бы и нет? Если твой шаблон - не банальный HTML файл с PHP вставками, то в файловой системе ему делать нечего, инклюдить его в движок все равно нельзя.
    Вроде бы уже обсуждали уже здесь, можно ли хранить шаблоны в базе. Даже пришли к выводу, что можно ;)
     
  22. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Dagdamor а если банальный HTML без PHP вставок?
    *пошел почитать тему :lol: *
     
  23. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Ganzal
    Хех... тогда это уже трудно назвать шаблоном :D
     
  24. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Dagdamor
    тогда я туплю... разве шаблон нельзя прировнять к допустим образцу заполнения заявки на выдачу паспорта?
    просто тупо размечено что куда пихать. проформ (шаблонов, образцов) может быть множество а логика заполния одна... разве не так? разве суть шаблона не в том чтобы выводить разные данные в одинаковом визуальном представлении дизайна или скажем одни и те же данные в разном представлении если есть набор шаблонов?
     
  25. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Ganzal
    Все это верно, но это не имеет отношения к реализации шаблонизатора. Шаблон можно хранить в виде файла, если этот файл потом можно использовать напрямую - запросить через браузер (как с изображениями) или подключить в скрипт. Если оба варианта отпадают, то смысла хранить шаблон как файл нет. Операции закачки/скачивания через FTP - не самые удобные, а постоянные операции чтения с файловой системы - не самые быстрые. Вспомни Смарти ака самый тормозной шаблонизатор ever.