ОБНОВЛЕНИЕ
Способ обрабатывать этот случай является комбинацией буферизации вывода и соответствующих заголовков HTTP.
От HTTP/1.1 Specification Section 14.10:
HTTP/1.1 определяет «закрыть» вариант подключения для отправителя к сигнала о том, что соединение будет закрыто после завершения ответа.
Таким образом, если мы пройдем вдоль HTTP Content-Length заголовка в дополнение к Подключение: закрыть, браузер знает, чтобы закрыть соединение после указанной длины будет получен ответ:
- Буфер ВСЕ вывод скрипта, чтобы сохранить возможность отправки заголовков
- После того, как у вас есть полные выходные данные, отправьте соответствующие заголовки клиенту
- Продолжить r обработка ... но не пытайтесь отправить вывод или вы получите ошибки, потому что отправлены заголовки.
Также будьте осторожны, так как вы можете столкнуться с ограничениями времени выполнения скриптов в веб-сервере SAPI, если вы слишком много обрабатываете. Наконец, вы должны сказать PHP игнорировать «пользовательский прерывание» в этом конкретном скрипте, используя ignore_user_abort()
, потому что браузер закроет соединение в результате того, что вы делаете, и вы хотите, чтобы PHP продолжал обрабатывать.
<?php
ignore_user_abort();
ob_start();
// do stuff, generate output
// get size of the content
$length = ob_get_length();
// tell client to close the connection after $length bytes received
header('Connection: close');
header("Content-Length: $length");
// flush all output
ob_end_flush();
ob_flush();
flush();
// close session if you have one ...
// continue your processing tasks ...
?>
Вы можете изучить раздел руководства PHP на Connection handlingdocs.
В качестве альтернативы, почему бы не начать буферизацию вывода? Затем вы можете захватить весь вывод, который будет отправлен, а затем решить позже, если вы действительно хотите что-либо сделать с ним.
<?php
echo 'before output buffering';
ob_start();
echo 'after output buffering';
$output = ob_get_contents();
// script's only output to this point will be 'before output buffering'
// I changed my mind, send the output ...
ob_end_flush();
?>
Почему вы должны сделать это? Можете ли вы опубликовать немного своего кода, чтобы помочь нам понять немного больше? –
+1 к тому, что сказал Джонатан. Расскажите нам немного больше о том, почему вы хотите это сделать. –