2012-01-13 5 views
3

В PHP есть (готовый) способ проверить, была ли часть результата уже отправлена ​​клиенту?Проверьте, не была ли отправлена ​​часть вывода в PHP

Я знаю, что с headers_sent() вы можете проверить, если заголовки уже отправлены, но я также хочу, чтобы проверить, если любой выход был послан (так что, например, HTTP-Header Content-Length> 0).

(Обратите внимание, чтоob_start()начинает буферизацию с того момента, когда она называется. Но сторонние системы, реализующие свой код, возможно, уже послал вывод, что буферизация вывода является непригодным для использования, насколько я знаю.)

+1

* get_headers() возвращает массив с заголовками, отправленных сервером в ответ на запрос HTTP * (http://php.net/manual/en/function.get-headers. .php) – Quasdunk

ответ

3

Вы можете обернуть свой собственный ob_start вокруг всего остального и очистить его, когда решите. Он работает, даже если другие объекты ob_start и flush находятся внутри. Возьмем такой пример:

ob_start(); 
[...] 
//some 3rd party app which is included on the way 
    [...] 
    ob_start(); 
    [...] 
    ob_flush(); //at this moment the buffer isn't flushed to the client 
       //but to the parent ob_start, which is yours, so no output 
       //is sent yet 
[...] 
//ok, we're done, we can output now 
ob_flush(); 
1

PHP в большинстве случаев отправляет заголовки в Apache только с некоторым контентом или в конце выполнения скрипта. Итак, если отправляются заголовки, отправляется некоторый контент. Furthemore, как я понимаю, Content-Length вычисляется в любом случае после выполнения скрипта.

+0

Я не совсем согласен. Не каждый ответ HTTP имеет тело сообщения. Подумайте, например. перенаправления. Он отправляет только код статуса HTTP и заголовок Location. Поэтому не каждый ответ фактически содержит фактическое «содержание». И ответ не отправляется PHP, а сервером. PHP позволяет изменять некоторые заголовки и т. Д. – Quasdunk

+0

_sends headers_ означает, что PHP отправляет их в Apache. Извините, если бы я описал это неоднозначно. По вашему примеру, когда скрипт устанавливает заголовок «Местоположение», он в любом случае завершает выполнение. В большинстве случаев, с 'exit' или' die'. Итак, после этого, как я описал, отправляются заголовки. Заметьте 'или в конце выполнения скрипта' в моем сообщении. – Timur

Смежные вопросы