lamo4ok
@lamo4ok
Программист

В чем может быть разница между двумя серверами, по-разному обрабатывающими сброс буфера в php?

Суть такова. Есть два сервера, вот их версии:
1. PHP 5.4.45 (cli) (built: Jun 17 2016 17:55:12)
2. PHP 5.5.30-1~dotdeb+7.1 (cli) (built: Oct  1 2015 17:38:39)

Есть php-код:
header("HTTP/1.1 200 OK");
header("Connection: close");
ob_start();
echo __FILE__."<br>";
$size = ob_get_length();
header("Content-Length: $size");
sleep(2);
ob_end_flush();
flush();
sleep(2);
phpinfo();

который служит просто для проверки одного механизма работы. Он заключается в том, что нужно сначала отправить клиенту, вызывающему обработку этого кода, ответ 200 и закрыть соединение, а потом сделать что-либо еще. Это требуется для работы с одним из интернет-сервисов, у которого время на вебхук ограничено 5 секундами, иначе он разрывает соединение по таймауту и через какое-то время пробует повторить вебхук (запрос).

.htaccess выглядит так:
<IfModule mod_php5.c>
  # disable compressing
  php_flag zlib.output_compression off
  SetEnv no-gzip 1
</IfModule>

<FilesMatch \.php$>
    SetEnv no-gzip 1
</FilesMatch>

<IfModule mod_deflate.c>
  RemoveOutputFilter DEFLATE html txt xml css js php
</IfModule>

Options -Indexes


В общем влупил все, что смог найти в интернете.

Так вот на сервере 2 все происходит так, как и требуется, если судить по логу в отладчике Хрома:
https://yadi.sk/i/r_TWWuUEvrTff
А на первом сервере такая картина
https://yadi.sk/i/2Xa65xO7vrTeS
то есть никакой отдачи содержимого в середине скрипта не случается. В чем может быть проблема и куда бежать, что отключить или включить?
  • Вопрос задан
  • 117 просмотров
Решения вопроса 1
lamo4ok
@lamo4ok Автор вопроса
Программист
Что ж, изучение мануалов и тесты дали о себе знать. Вот такой код заработал как нужно:
header("HTTP/1.1 200 OK");
header("Connection: close");
ob_start();
phpinfo();
$size = ob_get_length();
header("Content-Length: $size");
ob_flush();
sleep(2);
echo __FILE__."<br>";

с таким вот .htaccess:
<FilesMatch \.php$>
    SetEnv no-gzip 1
</FilesMatch>

Что нужно было?

1. В .htaccess нужно было оставить только лишь отключение gzip для php файлов, оказывается - он все-таки был включен и это влияет на то, какими порциями веб-сервер будет отдавать контент, не смотря на мой код.

2. Была найдена разница в конфигах серверов, переменная output_buffering на сервере, который обрабатывал код так, не как ожидалось, эта переменная имеет значение no value (на "правильном" сервере это значение установлено в 4096).
Возможно, в итоге размер буфера берется откуда-то еще и в итоге страницы, на которых я пытался выводить сначала какую-то одинокую строчку, просто не отдавались из буфера на вывод. Как только я увеличил объем страницы, сделав php_info(), все встало на свои места. Вердикт - надо либо отдавать страницу большего размера (костыль), либо изменить настройки работы с буфером таким образом, чтобы функция ob_flush() гарантированно производила отправку содержимого буфера клиенту.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы