2012-01-13 3 views
3

PHP에서 출력의 일부가 이미 클라이언트로 전송되었는지 확인하는 준비가되어 있습니까?출력의 일부가 이미 PHP로 전송되었는지 확인하십시오.

나는 헤더가 이미 전송 된 경우 headers_sent()으로 확인할 수 있다는 것을 알고 있지만, 나는 또한 모든 출력이 (그래서 예를 들어, HTTP 헤더 Content-Length> 0에게) 전송 된 있는지 확인하고 싶습니다.

은 (내가 아는까지로ob_start()가 호출되는 순간에서 출력 버퍼링을 시작하는 것을 알 수 있습니다.하지만 내 코드를 구현하는 타사 시스템이 이미 출력을 보낼 수도, 따라서 출력 버퍼링을 사용할 수 없습니다.)

+1

* get_headers을 *.이 예제를 가지고 .php) – Quasdunk

답변

3

당신이 결정할 때 자신의 ob_start를 다른 모든 것에 감쌀 수 있습니다. 다른 ob_start 및 플러시가 내부에 있더라도 작동합니다. http://php.net/manual/en/function.get-headers (HTTP 요청에 대한 응답으로 서버가 보낸 헤더 배열을 반환) (

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-header 만 보냅니다. 따라서 모든 응답이 실제 '내용'을 실제로 포함하지는 않습니다. 그리고 응답은 PHP에 의해서가 아니라 서버에 의해 보내집니다. PHP는 단지 일부 헤더 등을 수정할 수 있습니다. – Quasdunk

+0

_sends headers_는 PHP가 아파치로 보내는 것을 의미합니다. 내가 이것을 애매하게 설명하면 유감이다. 당신의 예제에서, 스크립트가'Location' 헤더를 설정할 때, 어쨌든 실행을 끝냅니다. 대부분의 경우, 'exit'또는 'die'. 그래서,이 후에, 내가 설명한 것처럼, 헤더가 전송됩니다. 내 메시지에서 '또는 스크립트 실행 종료'에 유의하십시오. – Timur

관련 문제