Это проблема http-сервера?

Это проблема http-сервера?
<?php
    ob_start();
    echo 'test';
    ob_end_flush();
    flush();
    sleep(10);

Я попытался вывести ответ на ajax-запрос до завершения соединения, но это не сработало — ответ будет получен через 10 секунд. Это проблема http-сервера, в моем случае Apache? Если это правда, как это исправить, чтобы он сразу же возвращал ответ?

решение1

Хотя предполагается flush(), что ob_end_flush()и ob_flush()гарантирует отправку вывода на сервер, я обнаружил, что PHP иногда не очень-то терпим к конкретной конфигурации программного обеспечения.

В Windows буферизация вывода может быть особенно сложной в настройке, и единственный способ, который я обнаружил и который надежно работает между системами, — это сбрасывать буферизацию вывода при каждой очистке, например так:

<?php
obf_start();

for($i=0;$i<70;$i++) {
    echo 'printing... ', microtime(true), '<br />';

    if($i % 3 == 2) obf_flush();

    usleep(300000);
}

function obf_start() {
    ob_start();
}

function obf_flush() {
    ob_end_flush();
    ob_flush();
    flush();
    obf_start();
}

Это уродливое решение? Да, это так. Но покавсе ошибки, связанные с буферизацией выводаисправлены, я не думаю, что этот обходной путь исчезнет из рабочего кода в ближайшее время.

Также обратите внимание, что некоторые антивирусные программы (Panda AV и другие) и прокси будут хранить все данные до тех пор, пока сокет не будет закрыт. Вы не можете гарантировать, что все клиенты получат правильные сброшенные данные.

решение2

Самый простой способ узнать, является ли проблема сервером или браузером/библиотекой, — это отслеживать запрос в реальном времени. 2 самых простых способа сделать это в вашем случае:

  • Поджигатель: Это расширение Firefox покажет вам все ваши запросы AJAX в реальном времени по мере их отправки, а также покажет вам ответ сразу после его получения браузером.
  • Захват трафика: используйте такой инструмент, как Wireshark, чтобы в режиме реального времени отслеживать отправляемые запросы и возвращаемый с сервера TCP-трафик.

Если вы видите, что данные возвращаются сразу, но для их отображения требуется 10 секунд, ваш браузер или библиотека AJAX ждут закрытия соединения перед обработкой ответа. Если требуется 10 секунд, прежде чем вы что-либо получаете обратно, ваш сервер или модуль PHP здесь неисправен.

Связанный контент