2010-08-13 6 views
7

나는 미리 길이를 알지 못하게 큰 (멀티 MB) 출력을 생성하는 PHP 스크립트를 만들고 있습니다. 나는 을 통해 php://output에 직접 편지를 쓰고 있으며, 표준 출력과 Transfer-Encoding: chunked (필요에 따라 청크 인코딩)을 사용해 보았지만 다운로드 대화 상자를 표시하기 전에 모든 데이터가 기록 될 때까지 브라우저를 시도 할 때까지 기다리지 않아도됩니다. 나는 헤더 이후와 각 청크 후에도 flush()을 보내려고했지만 이것도 아무런 효과가 없다.Apache/PHP 출력 캐싱

서버에서 몇 KB를받은 후 브라우저가 정상적으로 표시하므로 아파치가 출력을 캐시하고 있다고 생각합니다.

누구든지이 캐싱을 중지하고 생성 된 데이터를 브라우저로 플러시하는 방법에 대한 아이디어가 있습니까? 당신은 phpinfo를 아는 것이 유용 할 수 있도록

감사합니다, 모두의 J

+1

전체 내용이 생성 될 때까지 아파치가 비워지지 않는다고 생각하는 대신 wireshark 또는 유사한 도구를 사용하여 어떤 데이터가 브라우저로 보내지는지 확인하십시오. 일을 늦추려면 몇 가지'sleep (1)'호출을 삽입하십시오. (나는 아파치가 버퍼를 플러시하기 전에 단일 소켓에 몇 메가 바이트를 유지할 것 같지 않다.) – sarnold

+3

내 생각에, 당신은 GZIP 압축을 php.ini 및/또는 apache config에서 사용할 수있다. 이 경우 아파치는 항상 캐시합니다. 이것을 피하는 방법을 찾지 못 했으므로 (압축 해제 이외), 다른 사람들이 이것에 대해 아는 것을 볼 수 있습니다. 그래도 serverfault.com에 대한 질문이 될 수도 있습니다 ... – BlaM

+0

@sarnold - 내가 Fiddler를 통해 요청을 추적하면서 다운로드 대화 상자가 나타날 때까지 응답을 보지 못하는 것으로 추측합니다. 그래서 나는 그것이 서버 측에서 캐싱하고 있다고 확신합니다. @BlaM - GZIP가 활성화되었다고 말하는 것이 맞습니다. 스트리밍 압축 알고리즘이므로 가능한 원인으로 생각하지 않았습니다.하지만 문제가 될 수 있습니다. 이 특정 스크립트를 사용하지 않도록 설정하고 어떤 결과가 발생하는지 확인하겠습니다. 감사. – JWood

답변

1

첫째, 연기하는거야 그의 주석에서 언급 한 것처럼이, PHP 설정 OutputBuffering의 경우는, 그것을 못해 일을 사용할 수 있습니다().

다음 작업은 yor 웹 서버에 저장된 큰 파일과 함께 작동하면 readfile을 사용하여 출력 해 봅니다. 그리고 이것과 함께 올바른 헤더를 보내 었는지 확인하십시오. StackOverflow: How to force a file download in PHP

을 그리고 당신이 그것에있는 동안, 스크립트의 상단에 ob_end_flush() 또는 ob_end_clean() 전화 : ReadFile을()하고, 여기에 제공되는 올바른 헤더를 보내는 방법에 대한 힌트.