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
то есть никакой отдачи содержимого в середине скрипта не случается. В чем может быть проблема и куда бежать, что отключить или включить?
  • Вопрос задан
  • 115 просмотров
Решения вопроса 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() гарантированно производила отправку содержимого буфера клиенту.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
07 мая 2024, в 14:11
4000 руб./за проект
07 мая 2024, в 14:10
10000 руб./за проект
07 мая 2024, в 13:57
5000 руб./за проект