браузер — данные не отправляются при закрытии соединения

У меня есть скрипт, который вызывается через 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
?>

Ошибки:

  • cURL: (18) передача закрыта, осталось 9 байтов для чтения
  • браузер: net :: ERR_CONTENT_LENGTH_MISMATCH

Это второй метод. Оно работает.

<?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
?>

Это было построено методом проб и ошибок, и я понятия не имею, почему один работает, а другой нет.

Я надеюсь, что вы можете помочь мне понять это.

1

Решение

Похоже, проблема в ваших последних трех строках:

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();
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]