ob_start() - чудеса

berkut

Новичок
ob_start() - чудеса

подскажите почему так может быть - поставил вывод всего содержимого native php template более-менее громоздкий в буфер - время генерации страницы снизилось в 3-6 раз! тупо даже на глаз заметно. сервак дохленький, было 3-4 сек на одной тяжёлой странице, стало 1.5-0.8. Такое вообще возможно?

-~{}~ 07.05.08 11:00:

блин, убираю буфер - увеличивается, ставлю - уменьшается. чёткая зависимость
 

berkut

Новичок
я думал об этом, но ничё не додумал. в принципе какая разница:
//ob_start();
include 'Template.php';
//ob_end_flush();
echo ведь сливает инфу апачу и не ждёт от него ответа?! тоже самое делает и ob_flush(); я протестил 3 варианта:
1)
include 'Template.php';
echo makeTime() - $start_time;
2)
ob_start();
include 'Template.php';
echo makeTime() - $start_time;
ob_end_flush();
3)
ob_start();
include 'Template.php';
ob_end_flush();
echo makeTime() - $start_time;

так вот, 2 и 3 почти не отличаются! почему? и скрипт ведь не ждёт апач, когда он всё отдаст? он ведь умирает сразу
 

berkut

Новичок
output_buffering no value no value
output_handler no value no value

implicit_flush Off Off

-~{}~ 07.05.08 11:34:

чудеса какие-то. единственное, что могло быть логичным - передача от скрипту апачу, куда там, в стдаут, идёт медленно. но анрил какой-то
 

berkut

Новичок
ksnk
поясни пожалуйста механизм. насколько я понимаю, пакеты летят по сети от апача, а не от php в любом случае. пых-пых сразу всё отдаёт апачу, умирает, а тот(апач) может отдавать, то что получил от php хоть сутки. И тсп/айпи разве не бьёт всё по маленьким пакетам - т.е. вроде-бы нельзя отправить большуший пакет скопом.

-~{}~ 07.05.08 13:10:

т.е. я вижу механизм такой: апач и пых работают "рассогласовано". пых отдаёт апачу что-то и продолжает выполнятся, апач асинхронно получает от пыха что-то, ну там буферы его собственные, и отдаёт это клиенту не глядя на php.
 

kode

never knows best
Автор оригинала: berkut
ksnk
поясни пожалуйста механизм. насколько я понимаю, пакеты летят по сети от апача, а не от php в любом случае. пых-пых сразу всё отдаёт апачу, умирает, а тот(апач) может отдавать, то что получил от php хоть сутки. И тсп/айпи разве не бьёт всё по маленьким пакетам - т.е. вроде-бы нельзя отправить большуший пакет скопом.

-~{}~ 07.05.08 13:10:

т.е. я вижу механизм такой: апач и пых работают "рассогласовано". пых отдаёт апачу что-то и продолжает выполнятся, апач асинхронно получает от пыха что-то, ну там буферы его собственные, и отдаёт это клиенту не глядя на php.
Домыслы такие домыслы. Присоединяюсь к совету предыдущего оратора
 

berkut

Новичок
да, что-то тёмное.. похоже никто толком не знает, как всё это происходит.
 

dimagolov

Новичок
berkut, у меня не так давно возникла ситуация с генерацией html на 2 и более метра, и я уже зависимость вывода php без буферизации от скорости передачи на клиента отмечал тут: http://phpclub.ru/talk/showthread.php?postid=777462#post777462


А вообще суть выразил ***** в первом же ответе тебе.
 

cDLEON

Онанист РНРСlub
Хех. Ни чего удивительного 8)
Апач, на сколько я понял по тестам, кушает примерно по 10 кб данных из скрипта за один раз, потом ждёт, пока данные ушуршат.
ни чего не читая. А пхп ждёт, пока ему предоставят место под буфер.
И вызов ечо - получается блокирующим.
В этом кстати, и есть самая огромная проблема схемы бэк-энд\фронт-энд серверов. Ну по крайней мере НГИНКСа. Он кушает ВСЁ, что ему подсовывает апач и когда ему отдают большой файл через скрипт, сервак умирает без единого кусочка свободной памяти 8)
ПС. Кстати. Кто-нибудь может протестировать передачу контента через CGI-PHP ? А именно факт того, что ечо тож получится блокирующим ?
 

berkut

Новичок
cDLEON
о! мерси за объяснение. эт получаеца, что в подовляющем большинстве случаев буферизация выгодна.
 

dimagolov

Новичок
berkut, после той темы у меня во все скрипты инклюдится такой файлик:
PHP:
<?php
if(defined('StartGZip') && StartGZip) { // Константа, которая определяет надо или не надо жать, для отладки JS нужна
	ob_start("ob_gzhandler", -1);
	define('__OWC__CurPageCompressed', TRUE); // Это у меня в логах показывается
} else {
	ob_start ();
	define('__OWC__CurPageCompressed', FALSE);
}
?>
 
Сверху