Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to correctly show output at every echo on all browsers?

I moved my files to a new server and I had a script that instantly showed output on every echo to the browser, but this isn't working on the new server. Here is my test code:

@ini_set('output_buffering', 0); @ini_set('implicit_flush', 1);

for ($i = 0; $i < ob_get_level(); $i++) ob_end_flush();

ob_implicit_flush(1);

ignore_user_abort(true); set_time_limit(0);


$max_wait_time = 30;

$begin_time = microtime(true);

$elapsed_time = 0;


while(!connection_aborted()) {

    echo $i++.str_repeat(' ', 1020).'<br/>';

    flush(); ob_flush();

    usleep(1000000);

    if($elapsed_time > $max_wait_time){ break; }

    $elapsed_time++;

}

I've tried a few things which has become the above. But turning output buffering on and flushing hasn't worked for me. I have tested this on Chrome and Firefox, they both just output everything at the end.

Any ideas?

like image 262
Abs Avatar asked Mar 16 '11 12:03

Abs


2 Answers

Excerpt from the flush documentation:

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. [...]

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.

Chances are high that you changed to a different web server (or web server configuration), which buffers the output of the whole script before outputting it.

like image 136
NikiC Avatar answered Nov 19 '22 02:11

NikiC


The setting you're looking for is in your PHP.ini and it's called output_buffering:

; output_buffering
;   Default Value: Off
;   Development Value: 4096
;   Production Value: 4096

Set it to off manually and restart your webserver to make flush() actually flush something when you want it, not after 4kb of data :)

Note that ini_set doesn't always necessarily has to work for this. If you want full control, disable it in php.ini itself, or as a .htacces php_value flag

like image 33
SchizoDuckie Avatar answered Nov 19 '22 01:11

SchizoDuckie