php flush не работает - PullRequest
       33

php flush не работает

12 голосов
/ 16 января 2011
<?php
for($i=0;$i<20;$i++)
{
    echo 'printing...<br />';
    ob_flush();
    flush();

    usleep(300000);
}

?>

URL-адрес, содержащий код: http://domainsoutlook.com/sandbox/delayed.php

У меня есть выделенный сервер, чтобы я мог вносить изменения. Я использую apache и nginx в качестве прокси-сервера.

Ответы [ 12 ]

0 голосов
/ 26 января 2013

В php.ini:

output_buffering = Выкл. Zlib.output_compression = Выкл.

В nginx.conf:

fastcgi_keep_conn on;# <решение </p>

proxy_buffering off;gzip off;

0 голосов
/ 27 декабря 2012

Пока я читаю, это кажется очень трудным решением, и единственный (грязный) способ, который я нашел, это написать что-то бесполезное для вывода, чтобы заполнить ≠ буферы. - без ССЛ - без output_buffering необходима очистка, буферы nginx могут быть уменьшены до размера заголовка php - с output_buffering необходимо добавить ob_flush, чтобы иметь то же поведение, что и выше - в ssl есть другой буфер для ssl, и NGX_SSL_BUFSIZE исправлено в компиляции nginx

Вот мой файл test.php (вызовите его с помощью? Size = ..., чтобы изменить запись пространства в цикле)

<!DOCTYPE html>
<html>
<head></head>
<body>
<?php
$vars = array('output_buffering', 'zlib.output_compression');
print('<p>');
foreach ($vars as $var) {
  print("$var : ");
  var_dump(ini_get($var));
  print('<br />');
}
print("ob_get_level() : " .ob_get_level());
print('</p>');
if (ob_get_level()) {
  $bytes = ob_get_length();
  ob_flush();
}

$nb_iterations = !empty($_GET['nb']) ? max(2, (int) $_GET['nb']) : 5;
$size = !empty($_GET['size']) ? $_GET['size'] : 0;

for ($i = 1; $i < $nb_iterations; $i++) {
  sleep(1);
  print(str_repeat(' ', 1024 * $size ));
  print("<p>wait $i s</p>");
  if (ob_get_level()) {
    $bytes += ob_get_length();
    print($bytes + strlen($bytes));
    ob_flush(); // this is working, results aren't depending on output_buffering value
  }
  flush(); // this is needed  
}
?>
</body>
</html>

И нижний конф, который я могу установить, это

location ~ ^/test.php$ {
  gzip off;
  fastcgi_pass   unix:/var/run/php5-fpm/ssl.socket;
  fastcgi_param   QUERY_STRING            $query_string;  
  fastcgi_param   REQUEST_METHOD          $request_method;
  fastcgi_param   SCRIPT_FILENAME         $request_filename;   
  # if too low => upstream sent too big header while reading response header from upstream
  fastcgi_buffer_size 128; 
  fastcgi_buffers 2 128;  
  fastcgi_busy_buffers_size 128;
}
...