Проблем с ob_start

primecode

Active Member
Чудя се какво не мие наред с PHP-то на единият сървър (Ubuntu Server 11.04). Ето един стандартен скрипт за пример:

PHP:
ob_start();

for ( $i=1; $i<=3; $i++ ) {
	echo $i . '<br />';
	ob_flush();
	flush();
	sleep(1);
}

ob_end_flush();

На локалния ми хост това си работи добре, но сложа ли го на сървъра си не иска да работи правилно. Променях в ph.ini output_buffering ми е Off, както и zlib.output_compression = Off
Цял ден се ровя из нет-а но така и не си реших проблема. Ако някой има идея - да сподели.
 
От: Проблем с ob_start

По показания начин, скрипта трябва да извежда числата от 1 до 3 през една секунда и да приключи, а сега изчаква 3 секунди и изписва всичко наведнъж.
 
От: Проблем с ob_start

output_buffering = Off
output_buffering = 4096

Код:
<?php
echo 'starting...<br/>';
for($i = 1; $i < 3; $i++) {
  print "$i<br/>";
  flush();
  sleep(2);
}
print 'DONE!<br/>';
аз това намерих
 
От: Проблем с ob_start

@Alf локалния ми хост е уиндоус
@AlanFort, не разбрах какво искаше да покажеш с това което си намерил.
PHP на локалния е 5.3.1 а на сървъра е 5.3.5 но не вярвам в разликите да е проблема.
Надявам се да се появи някой по-разбиращ :)
 
От: Проблем с ob_start

напиши си кода в гугъл, аз доста страници от форуми намерих, там ще питаш.
 
От: Проблем с ob_start

Нали не мислиш, че преди да питам тук не съм търсил ;)
Изчетох сума форуми, хелпове, документации, ... и пак нищо. Не знам какво и къде пропускам. Междувременно продължавам да търся но се надявам някой тук да се е справял вече с този проблем и да помогне.
 
Каква е целта на това упражнение? Най-добре измисли друг начин. Идеята/предназначението на буферите, изобщо не е да се ползват за такива броячи :). И да го нагласиш да ти работи на теб, за останалите потребители я работи, я не.

http://bg.php.net/flush

Flushes the write buffers of PHP and whatever backend PHP is using (CGI, a web server, etc). This attempts to push current output all the way to the browser with a few caveats.

flush() may not be able to override the buffering scheme of your web server and it has no effect on any client-side buffering in the browser. It also doesn't affect PHP's userspace output buffering mechanism. This means you will have to call both ob_flush() and flush() to flush the ob output buffers if you are using those.

Several servers, especially on Win32, will still buffer the output from your script until it terminates before transmitting the results to the browser.

Server modules for Apache like mod_gzip may do buffering of their own that will cause flush() to not result in data being sent immediately to the client.

Even the browser may buffer its input before displaying it. Netscape, for example, buffers text until it receives an end-of-line or the beginning of a tag, and it won't render tables until the </table> tag of the outermost table is seen.

Some versions of Microsoft Internet Explorer will only start to display the page after they have received 256 bytes of output, so you may need to send extra whitespace before flushing to get those browsers to display the page.
 
От: Проблем с ob_start

Примера не е от значение, просто не ми работи тоя буфер та затова. Трябва да видя модулите които за зададени на апачето да зарежда, може би там е проблема.
 
Буфера най-вероятно си работи съвсем нормално. Просто не прави това, което на теб ти се иска :).
Тоест той сигурно го прави, но някой след това ти разваля работата - я друг буфер, я някой софтуер на хостинга/модул на сървъра, я браузъра като не е на localhost се държи различно ...
Хората са си го написали съвсем ясно. Ама ти малко на принципа 5 часа работа ми спестяват 5 мин четене :)
 
От: Проблем с ob_start

Оказва се, че не е браузъра. На друг хост си работи както на локалхост-а. Искам просто да разбера какво не ми е наред при сървъра за да си оправя този бъг. И не за 5 а за 12 часа четене не успях да се оправя, затова искам помощ от тук.
 

Горе