Спрашивается для чего использовать буферизацию вывода, чтобы просто найти что-то в
тексте и заменить. Вероятно, имеет смысл продумывать варианты реализации когда в
переменную или в буфер обмена записывается, как отметил 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>";