ОБНОВЛЕНИЕ
В этом случае можно справиться с помощью буферизации вывода и соответствующих заголовков HTTP.
Из раздела 14.10 спецификации HTTP/1.1:
HTTP/1.1 определяет опцию «закрыть» соединение для отправителя, чтобы сигнализировать, что соединение будет закрыто после завершения ответа.
Таким образом, если мы передаем HTTP-заголовок Content-Length в дополнение к Connection: close, браузер знает, что нужно закрыть соединение после получения ответа указанной длины:
- Буферизируйте ВСЕ выходные данные сценария, чтобы сохранить возможность отправки заголовков.
- Получив полные выходные данные, отправьте клиенту соответствующие заголовки.
- Продолжайте обработку... но не пытайтесь отправить выходные данные, иначе вы получите ошибки из-за того, что заголовки были отправлены.
Кроме того, будьте осторожны, так как вы можете столкнуться с ограничениями времени выполнения скрипта в 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, посвященный Обработка соединенийдокументы.
В качестве альтернативы, почему бы не запустить буферизацию вывода? Затем вы можете захватить все выходные данные, которые будут отправлены, а затем решить, действительно ли вы хотите что-то с ними делать.
<?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();
?>
person
rdlowrey
schedule
23.01.2012