У меня есть скрипт, который вызывается через AJAX. Скрипт запускается на сервере Apache 2.4.7 и PHP 5.5.9.
Сценарий отправляет ответ браузеру, после чего закрывает соединение и продолжает выполнять еще некоторые действия.
Это первый метод. Не работает
<?php
ob_start();
echo "some text";
$size = ob_get_length();
ignore_user_abort(true);
header("Connection: close\r\n");
header("Content-Length: $size");
header("Content-Encoding: None", true);
ob_end_flush();
flush();
ob_end_clean();
//after this a few actions follow
?>
Ошибки:
Это второй метод. Оно работает.
<?php
ob_start();
echo "some text";
$data = ob_get_contents();
$size = ob_get_length();
ob_end_clean();
ignore_user_abort(true);
header("Connection: close\r\n");
header("Content-Length: $size");
header("Content-Encoding: None", true);
echo $data;
ob_end_flush();
flush();
ob_end_clean();
//after this a few actions follow
?>
Это было построено методом проб и ошибок, и я понятия не имею, почему один работает, а другой нет.
Я надеюсь, что вы можете помочь мне понять это.
Похоже, проблема в ваших последних трех строках:
ob_end_flush();
flush();
ob_end_clean();
ob_end_flush()
а также ob_end_clean()
оба отключают выходную буферизацию.
В соответствии с php’s ob_start ():
Для вывода того, что хранится во внутреннем буфере, используйте
ob_end_flush()
, С другой стороны,ob_end_clean()
будет молча отбрасывать содержимое буфера.
Комбинация двух стирает ваш вывод.
Я могу заставить ваш первый фрагмент работать, когда я изменю его на:
ob_start();
echo "some text";
$size = ob_get_length();
ignore_user_abort(true);
header("Connection: close\r\n");
header("Content-Length: $size");
header("Content-Encoding: None", true);
ob_flush();
ob_end_clean();
Других решений пока нет …