[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ob_start()
Страницы: 1, 2
callate
andrey888, то же самое, что написал Игорь_Vasinsky, только доступно:

function show ( $a ) {
return "Значение - {$a} <br/>";
}

ob_start();

echo "До выполнения функции <br/>";
echo "Игорь_Vasinsky";
echo "После выполнения функции <br/>";

$content = ob_get_contents();

ob_end_clean();

// ...... ....... ..... что-то делаем

echo str_replace("Игорь_Vasinsky", show(10), $content);


Результат:
До выполнения функции 
Значение - 10
После выполнения функции
OleKh
Спрашивается для чего использовать буферизацию вывода, чтобы просто найти что-то в
тексте и заменить. Вероятно, имеет смысл продумывать варианты реализации когда в
переменную или в буфер обмена записывается, как отметил andrey888 "вагоны html" (хотя
трудно представить где такое может использоваться). Например, php генерирует 500кб html
кода и где-то на 100кб требуется вывести что-то в начало (например заголовок таблицы),
но echo уже не отработает т.к. поезд ушел ) остается замена кода. В таком случае чтобы не
искать это что-о в 500кб кода, оптимальнее было бы найти в 100кб, когда это заранее известно. Но если я правильно понимаю, в любом варианте с буферизацией поиск и замена происходит после выполнения функции буферизациии. Т.е. и callback function и userdefined function выполнятся после того как будет сформирован буфер.


Для поиска оптимального решения тестировал 3 варианта,
1. Callback function - - 0.017 сек
2. Concatenating operator - 0.054 сек
3. User defined function - 0.014 сек

К моему удивлению, Callback function незначительно, но уступает User defined function.

Ещё заметил что результаты по callback function сильно разнятся в пределах от 14 до 25 ms, тогда как User defined function в пределах 14-15 ms

Т.е получается, что добавить в переменную контент через ob_get_contents(), очистить буфер через ob_end_clean(), применить пользовательскую функцию и вывести контент на экран через echo быстрее чем применить callback функцию к буферу, вывести содержимое буфера на экран и очистить буфер используя ob_end_flush(). По кол-ву вызовов, первый вариант должен уступать второму, а выходит что нет.


$PAGE_PARSE_START_TIME =  microtime();

ob_start("callback");
echo '</br>
Doctype'
;
for($i=0; $i<= 100000; $i++){
if($i==20000) $a = "Hello World Doctype ".$i;
echo ' html';
}
ob_end_flush();

function callback($buffer)
{
global $a;
return (str_replace("Doctype", $a, $buffer));
}

$time_start = explode(' ', $PAGE_PARSE_START_TIME);
$time_end = explode(' ', microtime());
$parse_time = number_format(($time_end[1] + $time_end[0] - ($time_start[1] + $time_start
[0])), 3);
echo "<span style=\"color: red; font-size: 30px; position: fixed; top:0; left:0;\">Callback -
$parse_time</span>";

$PAGE_PARSE_START_TIME = microtime();

$text = 'Doctype';
for($i=0; $i<= 100000; $i++){

if($i==20000)
str_replace("Doctype", "Hello World Doctype", $text);
$text .= ' html';
}

echo $text;

$time_start = explode(' ', $PAGE_PARSE_START_TIME);
$time_end = explode(' ', microtime());
$parse_time = number_format(($time_end[1] + $time_end[0] - ($time_start[1] + $time_start
[0])), 3);
echo "<span style=\"color: red; font-size: 30px; position: fixed; top:0; left:220px;
\">Concatenating operator - $parse_time</span>";

$PAGE_PARSE_START_TIME = microtime();

function show ($a, $content ) {
return str_replace("Doctype", $a, $content);
}

ob_start();
$a= '';
echo 'Doctype';
for($i=0; $i<= 100000; $i++){
if($i==20000)
$a = "Hello World Doctype ".$i;
echo ' html';
}
$content = ob_get_contents();
ob_end_clean();

echo show($a, $content);


$time_start = explode(' ', $PAGE_PARSE_START_TIME);
$time_end = explode(' ', microtime());
$parse_time = number_format(($time_end[1] + $time_end[0] - ($time_start[1] + $time_start
[0])), 3);
echo "<span style=\"color: red; font-size: 30px; position: fixed; top:0; left:600px;\">
User defined function -
$parse_time</span>";
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.