2009-03-16 7 views
3

나는 그것이 가능하다는 것을 안다. 그러나 나는 그것을 이해하는 것처럼 보이지 않는다.콘텐츠 길이가없는 PHP로 데이터를 보내는 방법은 무엇입니까?

몇 십만 개의 결과가있는 mySQL 쿼리가 있습니다. 결과를 보낼 수 있기를 원하지만 응답을 위해 콘텐츠 길이 헤더가 다운로드를 시작해야합니다.

phpMyAdmin에서 데이터베이스를 내보내려면 바로 다운로드를 시작하고 FF는 알 수없는 파일 크기를 나타내지 만 작동합니다. 나는 그 코드를 보았지만 그것을 이해할 수 없었다.

도움 말?

감사합니다.

답변

9

this document는 14.14 상태. 즉, 크기를 말할 수 없다면 보내지 않아도됩니다.

보내지 마십시오.

모든 데이터를 사용하기 전에 데이터 부분을 브라우저로 보내려면 출력 버퍼를 플러시합니까? 어쩌면 그것이 머리말이 아니라 문제일까요?

당신이 플러시 사용하는 방법은 같다 :

  • 클라이언트에 현재의 버퍼를 전송해야하는() 버퍼에
  • 플러시를 추가해야하는 몇 가지 출력을 생성
  • 쿼리 결과를 많이 반환하는 경우 고토 1

그래서, 당신은 단지를 생성 할 수 예를 들어 100 또는 1000을 출력 한 다음 플러시하는 등의 작업을 수행 할 수 있습니다.

또한 클라이언트 브라우저가 파일을 창에 표시하는 대신 저장하려고 시도하면 콘텐츠 처리 : 첨부 파일 헤더를 사용해 볼 수 있습니다. 여기서는 specification, 19.5.1 섹션을 참조하십시오.

+0

나는 헤더를 가지고있다. 그런 다음, 나는 플러시를 가지고있다. 그런 다음 SQL 쿼리를 가진다. 그래도 플러시 후에는 저장 대화 상자가 나타나지 않습니다. 작은 파일 일 때 파일 다운로드가 완료되면 팝업됩니다. 내가 시도하는 SQL 쿼리는 45 초가 걸리며 헤더가 전송 된 후 시간 제한을 유지합니다. – phazei

+0

은 anwser에서 조금 더 지정되었습니다. – kender

+0

내 머리글 : header ('Content-Type : "'. $ mime. '"'); header ('Content-Disposition : attachment; filename = "'. $ filename. '"'); header ("Content-Transfer-Encoding : binary"); header ('Expires : 0'); 헤더 ('Pragma : no-cache'); – phazei

0

Content-Length 헤더 필드를 설정할 필요가 없습니다. 이 헤더 필드는 예상 한 데이터 양을 클라이언트에게 알려주는 것입니다. 사실, "잘못된"값은 클라이언트가 일부 데이터를 버리는 원인이 될 수 있습니다. 메시지의 길이를 전송하기 전에 결정할 수 있습니다 때마다이이 섹션 4.4의 규칙에 의해 금지되지 않는 한 HTTP에서 이,이, 발송해야한다는 부분에

0

FireFox에서 LiveHTTPHeaders 플러그인을 사용하면 phpMyAdmin에서 보내는 헤더와 애플리케이션에서 보내는 헤더의 차이를 알 수 있습니다. 나는 네가 누락 된 부분을 구체적으로 모르지만 이것은 힌트를 줄 것이다. 빠른 테스트를 실행하는 하나의 헤더는 "Transfer-Encoding : chunked"이며 컨텐츠 길이를 보내지 않고 있음을 알 수 있습니다. 다음은 이미이없는 경우 파이어 폭스 플러그인에 대한 링크는 다음과 같습니다 당신이 ... 을 드롭 할 수 있습니다 LiveHTTPHeaders

1

모든 콘텐츠가 생성되기를 기다리는 gzip을 사용하고있을 가능성이 있습니다..htaccess에 대한 지시 사항을 확인하십시오.

2

청크 분할 전송 인코딩을 사용할 수 있습니다. 기본적으로 "Transfer-encoding : chunked"헤더를 보내면 데이터는 청크 모드로 전송됩니다. 즉, 청크가 뒤 따르는 청크의 길이를 전송합니다. 데이터가 끝날 때까지이 작업을 반복합니다.이 시점에서 길이가 0 인 청크를 보냅니다.

세부 사항은 RFC 2616입니다.

관련 문제