CI 묻고 답하기

제목 파일다운로드시 65메가 이상은 500에러가 발생합니다.
카테고리 CI 2, 3
글쓴이 재빠른설계자 작성시각 2017/11/18 22:51:54
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 13985   RSS

안녕하세요. codeigniter 한국사용자 포럼에서 열심히 배워서 조금의 성과를 내고 있는 중입니다.

코드이그나이터로 작업을 하면서 한국사용자포럼이 있다는 것에 안심되고 든든하게 생각하며 늘 감사히 생각하고 있습니다.

운영자분들과 질문 답변주시는 모든 분들 감사드립니다.

 

제가 질문드리고자 하는 것은 

파일다운로드를 하는데, 특이한 점이 65메가 이상이 넘는 파일은 500에러가 발생합니다.

65메가 이하의 파일들은 정상적으로 잘 사용하고 있습니다.

 

구현은 여기서 배운대로

// 실제로 파일을 다운로드 한다.           

$this->load->helper('download');

$data = file_get_contents($realPath);

$name = 'com_'.$vNum.'_'.$attachNum.$ext ;      // 다운받아서 보여지는 파일명  

force_download($name, $data);                        // 다운로드 한다.

 

 

아파치 설정이나 php 설정을 봐도 특별히 걸릴만한 설정은 없는 것 같습니다.

테스트로도.


1. 서버에 파일을 올려 놓고, url 로 직접 파일을 때려서 65메가 이상 다운로드 가능 ==> 아파치에서 허용하는 것으로 판단.

2. 간단한 php 테스트 파일을 만들어서 fopen 하여 fpassthru 로 다운받는 기본샘플로 역시 65메가 이상 다운로드 가능 ==> php 에서 허용하는 것으로 판단.


을 통해서 환경상의 문제는 아닌 것으로 생각하고 있습니다.

 

의심되는 부분이   force_download( ) 헬퍼인데요,

위아래로 echo 를 찍어 보니, force_download( ) 다음에는 에코가 화면에 찍히지 않더라고요.

그래서 force_download( ) 에서 뭔가 문제가 발생한 것이 아닌가 라는 생각을 하게 되었습니다.

 

그러나 65메가 라는 기준이 참 애매하고 모르겠습니다. 아얘 동작이 일관되게 안되던지, 65메가 이상의 파일만 안되는 것 보면 참 이해할 수 없습니다.

 

혹시 같은 경험을 하셨거나, 실마리를 찾을 팁을 주시면 정말 감사드리겠습니다.

 

 

 

 다음글 CI로 rest api 만드는 방법
 이전글 이러한 차이는 어떤 설정때문에 발생하는 건가요? (4)

댓글

빛그림 / 2017/11/19 10:20:14 / 추천 0

아마도 php.ini 설정 안에 있는 memory_limit 항목이 64메가로 설정되어 있는듯 합니다.

다운로드 메소드 안에 ini_set('memory_limit', -1); 설정하고 해보세요.

재빠른설계자 / 2017/11/19 16:38:22 / 추천 0

빛그림님 감사합니다. 해결됐습니다.

말씀주신대로 ini_set 으로 force_download( ) 전에 삽입해주니 정상작동합니다.

phpinfo 파일을 보면

memory_limit 128M 128M

이렇게 나와있어서 65메가 랑은 관련이 없다고 생각하여 넘어갔는데 이 것이 원인 이었던 것 같습니다.

다시한번 감사합니다.

kaido / 2017/11/20 09:22:20 / 추천 0
memory_limit = 64M
upload_max_filesize = 64M
post_max_size = 64M
file_uploads = On
max_execution_time = 300

 

파일업로드 관련 설정들 입니다.

메모리 리미트는 파일업로드시에 파일을 메모리에 담는데, [정확하게는 php 실행시 코드부분은 전부 여기에 담김] 

메모리가 부족하면 실행이 안됩니다.

 

upload_max_filesize  단어 그대로입니다. 파일 업로드에 제한을 거는 것입니다.

post_max_size 는 전송... submit 때렷을때 담아두는 용량 설정입니다.

 

max_execution_time 는 한 페이지가 실행 하는 제한 시간입니다.

파일 용량이 크면 그만큼 실행 시간이 길어질테고, 대기시간이 길어지면 타임아웃을 때려버립니다.

 

설정에 요령이 조금 있는데 

memory, upload, post 사이즈는 전부 동일하게 맞춰도 상관은 없습니다만 정확하게는 메모리가 가장 높아야 합니다.

post_max_size 값 > upload_max_filesize 값 >= memory_limit 값

이런 공식입니다.

memory_limit = 256M
upload_max_filesize = 245M
post_max_size = 255M

post는 파일 + 코드실행 공간 [최소 실행공간 약 10M]  정도를 포함 시켜야 하며 메모리보다 작아야 합니다.

 

여담입니다만 자체 서버는 메모리를 껴넣기만 하면 메모리는 금방 늘어날수 있습니다만, 

클라우드서버는 메모리를 박하게 주는 편입니다. 메모리를 높일수록 가격대가 훅 올라가는 형태라서 이런점에서는 단점이긴 하죠 ㅎㅎ