업데이트
이러한 경우를 처리하는 방법은 출력 버퍼링 및 해당 HTTP 헤더의 조합이다. HTTP/1.1 Specification Section 14.10에서
:
HTTP/1.1 연결이 반응 완료 후 폐쇄됩니다 신호를 보낸 사람에 대한 "close"연결 선택 사항을 정의한다. 우리는 HTTP 콘텐츠 길이 연결에 추가 헤더를 전달할 경우
그래서 : 지정된 응답 길이를 수신 한 후 가까운은 브라우저가 연결을 닫습니다 알고 :
- 전체 출력 데이터를 얻은 후에 클라이언트에 적절한 헤더를 보내십시오.
- 계속 하시겠습니까? r processing ...하지만 출력을 보내려고하지 않거나 헤더가 전송되었으므로 오류가 발생합니다.
너무 많은 처리를 수행하면 웹 서버 SAPI에서 스크립트 실행 시간 제한에 맞춰 실행할 수 있으므로주의하십시오. 마지막으로, ignore_user_abort()
을 사용하여이 특정 스크립트에서 "사용자 중단"을 무시하도록 PHP에 지시해야합니다. 브라우저가 수행중인 작업의 결과로 연결을 닫고 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 ...
?>
당신은 Connection handlingdocs에 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();
?>
왜 이렇게해야합니까? 조금 더 이해할 수 있도록 약간의 코드를 게시 할 수 있습니까? –
+1 조나단이 말한 것. 왜 당신이 이것을하고 싶은지 조금 더 말해주세요. –