Warning: array_merge(): Argument #2 is not an array in /hsphere/local/home/magistr/codeismy.name/wp-content/plugins/wp-pagenavi/scb/Options.php on line 46

CMS своими руками. Отложенные функции в PHP

Дата: Июль 23, 2009

(5) комментариев

Очень интересная задача и на первый взгляд абсолютно безсмысленная… Но всё же это не так. Сам ощутил необходимость возможности выводить контент в определённых местах уже после того, как он был выведен. Ну к примеру для установки заголовков типа settitle когда неизвестно какми должен быть заголовок до того как начали работать компоненты цмски на страниц.

Алгоритм работы данной технологии:
1. любой исходящий поток из PHP скрипта буферизируется
2. как только в коде встречается одна из функций, которые помеченны как отложенные, то:
1. весь буферизированный до этого контент запоминается в очередном элементе стэка A
2. в стэк A добавляется пустой элемент, который в дальнейшем будет заполнен результатом выполнения отложенной функции
3. имя отложенной функции запоминается в стэке B
4. буфер очищается и буферизация снова включается
Таким образом существует стэк A, в котором находится весь контент страницы разбитый на части. В этом же стэке есть пустые элементы предназначенные для их дальнейшего заполнения результатами отложенных функций.
Также существует стэк B, в котором запоминаются имена и параметры отложенных функции в порядке их следования в коде.

3. в конце страницы в служебной части эпилога выполняются следующие действия:
1. все отложенные функции из стэка B начинают выполняться одна за другой
2. результаты их выполнения вставляются в специально предназначенные для этого места в стэк A
3. весь контент из стэка A «склеивается» (конкатенируется) и выводится на экран

Таким образом, данная технология позволяет фрагментировать весь контент страницы, разбивая его на части с помощью специальных функций обеспечивающих временное откладывание выполнения других функций (отложенных функций). В конце страницы все отложенные функции выполняются одна за другой и результаты их выполнения вставляются в отведенные для этого места внутри фрагментированного контента страницы. Затем весь контент склеивается и выводится в поток (отправляется браузеру посетителя сайта).


А теперь практическая реализация.
Всё на самом деле на столько просто, что и проще быть не может.
Разбиваем на пхп шаблоны наш документ
header.php footer.php index.php
те кто работал с пхп шаблонами поймут почему именно так

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
header.php
<?php
$t=''; //тут будет храниться заголовок страницы
//тут мы пишем наш код всех нужных нам компонентов
function settitle ($title) {
    global $t;
      $t=$title;
    }
function showtitle () {
      echo "{TITLE}"; //выводим временный костыль для автозамены буферизированного контента
    }
ob_start();
echo "<html><head><title>";
showtitle (); //выводим заголовок страницы
echo "</title></head><body>";
?>
index.php
http://codeismy.name/archives/698/
<?php
settitle("Пример отложенных функций"); //обратите снивание заголовок наш уже вывелся выше
//но он был временно буферизирован и не попал

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

a




    5 комментариев на "CMS своими руками. Отложенные функции в PHP"

    Иван сказал:
    31.07.2009

    Прекрасный пример, но у меня не срабатывает:(
    сначала ругался на
    global $t=$title; , написал следующим образом: global $t; $t= $title; также добавил в страницу foot.php код
    после исходных код выглядит следующим образом:
    11

    что не так, не срабатывает буферизация, куда двигаться?

    magistr_bender сказал:
    31.07.2009

    вообщето тут был показан чисто алгоритм работы
    если итересует полностью рабочая версия то могу скинуть архивчиком. Просто статья рассчитана на людей, которые много работали с пхп шаблонизаторами
    тоесть тут
    index.php
    < ?php
    settitle ("Новый титл"); //обратите снивание заголовок наш уже вывелся выше
    //но он был временно буферизирован и не попал на страничку
    ?>
    предпологается, что будет подключён футер и хэдер. ну както так
    index.php
    < ?php
    include("header.php");
    settitle ("Новый титл");
    include("footer.php");
    ?>

    magistr_bender сказал:
    31.07.2009

    о, а кстати действительно небольшая ошибочка есть.
    подправил в статье
    http://codeismy.name/download/test.php
    Тут работает

    Стас сказал:
    14.09.2009

    Меня давно иетересует вопрос обработчика ошибок: set_error_handler. Возможно ли написать функцию, которая будет все ошибки складывать в буфер, а в определенном месте их выводить…

    Sergey сказал:
    14.09.2009

    хм… интересная задача.. я подумаю над реализацией

    Продолжение дискуссии на форуме: link


    Вы можете продолжить обсуждение этой статьи на форуме


    Имя : 
    Почта : 
    Сайт : 
    Комментарий : 

    Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.

    Создание сайта - Echo-group Раскрутка сайтов