2012-06-05 4 views
1

이것이 PHP 문제, 서버 구성 문제 또는 하드웨어 문제인지 확실하지 않지만 PHP로 시작하여 제안 사항이 있는지 확인합니다. 이 코드는 최근까지 제대로 작동했으며, 이로 인해 발생할 수있는 구성 변경 사항을 알지 못합니다. 최근 데비안 레니 (Debian Lenny)에서 Squeeze (PHP 5.2에서 5.3)로 업그레이드했지만 다른 Squeeze 서버에서도 잘 작동합니다.63MB 이상의 파일을 다운로드 할 때 500 오류가 발생했습니다

GET 변수로 전달 된 파일의 경로를 취하는 PHP 코드가 있습니다 (mod_rewrite를 통해 요청이 http://site.com/request/for/file.pdf에서 http://site.com/downloader.php?path=/path/to/file.pdf으로 다시 작성 됨). 이렇게하는 이유는 통계 추적과 관련이 있습니다.

파일이이 비트 코드와 함께 전달됩니다 (읽기 쉽도록 단순화 됨). 당신이 볼 수 있듯이 파일을 읽을 경우

if(is_readable($theFile)) { 

     //$fh= fopen($theFile, "r"); 
     header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); 
     header("Pragma: no-cache"); 
     header("Content-Type: application/pdf"); 
     header("Content-Disposition: attachment; filename=\"".basename($theFile)."\""); 
     header("Content-Length:".(string)(filesize($theFile))); 
     sleep(1); 
     //fpassthru($fh); 
     readfile($theFile); 
} 

의 코드는 (즉, 경로가 모두 올바른지)가 실행됩니다. 약 63MB 이하의 파일에 대해서는 모든 것이 잘 동작합니다. 63MB를 초과하는 경우 서버는 500 오류를 반환합니다. (이것은 Firefox/Chrome에서 '파일을 찾을 수 없음'으로보고되는데, '내부 서버 오류'라고 생각하면됩니다.하지만 그것은 내가 추측하는 또 다른 이야기입니다.) Apache 오류 로그에는 아무 것도 없습니다.

아무에게도 이런 일이 발생할 수있는 PHP 또는 Apache 서버 구성을 생각할 수 있습니까? 필자가 아는 한 PHP 메모리 제한은 readfile 또는 fpassthru의 영향을받지 않아야합니다. 나는 PHP 메모리 한계가 64MB이지만, PHP 로의 mod_rewrite 리디렉션을 끄지 않아도 문제가 해결된다는 점에 유의하십시오. 파일은 여전히 ​​다운로드되지 않습니다.

의견을 보내 주셔서 감사합니다.

업데이트] * * ** * ** * ** 확인 *

, 그래서 200메가바이트에 64메가바이트에서 PHP의 메모리 제한을 증가했다. 따라서 파일을 최대 200MB까지 다운로드 할 수 있습니다. 그러나 문제는 여전히 남아 있습니다. readfile과 fpassthru가 메모리 제한에 의해 영향을 받아서는 안되며, 출력 버퍼링이 꺼져 있는지 확인했습니다. 왜이 (새로운) 문제를 일으키는 큰 파일입니까?

+1

출력 버퍼링이 꺼져 있습니까? (readfile()에 대한 매뉴얼 페이지에 언급 된 유일한 메모리 문제입니다) –

+0

그래서 어느 쪽입니까? 500 또는 505 오류가 발생 했습니까? (505는별로 의미가 없습니다.) – Ryan

+2

PHP의'memory_limit' 가능성이 있습니다. 그게 뭐야? – mario

답변

1

해상도는 간단했습니다 (근무 시간 후).

php_value output_buffering 0 

이 Apache 가상 호스트 구성에 추가되었습니다.

ob_get_level()이 무엇을 말하는지에 관계없이 출력 버퍼링이 일어나고있는 것처럼 보입니다. 즉, 출력 버퍼링을 사용하는 것만으로 PHP 메모리 사용에 영향을 줄 수 있습니다.

관련 문제