Пока я читаю, это кажется очень трудным решением, и единственный (грязный) способ, который я нашел, это написать что-то бесполезное для вывода, чтобы заполнить ≠ буферы.
- без ССЛ
- без 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;
}