PHP에서 PNG이미지 업로드시 메모리 초과 메시지가 나오는 경우
Fatal error: Allowed memory size of 134217728 bytes exhausted
위와 같은 메모리 초과 문구는 생각보다 자주 봤을겁니다. ( 134217728 bytes 는 128MB입니다.)
간단하게
위와 같이 설정만 해줘도 큰 문제 없이 잘 작동합니다.
그런데 제가 작업한건
위와 같은 좀 큰 PNG이미지인데, 용량자체는 5.9MB정도 밖에 안한다는 겁니다.
여기에 무제한을 태운다고? 좀 그런데? 아니 많이 그런데...
아무래도 이상했습니다.
예전 같으면 그냥 저 페이지만 제한 해제해주고 끝냈을텐데 말이죠.
역시 잉여 같은 시간이 좀 남아야 생각을 잘 하나 봅니다.
https://stackoverflow.com/questions/17615808/png-upload-error-allocated-memory-size-error
PNG upload error - allocated memory size error
I'm trying to upload an image into an application I'm creating. The .png image occupies about 190KB in the file system and the resolution is 2000px wide and 1667 px in height. I have set the memory...
stackoverflow.com
위와 같은 오류와 관련된 질문을 찾았습니다. (구글 번역해서 보세요... ㅎㅎㅎ)
본인은 190KB정도의 이미지를 올리는데, 왜 그렇게 많은 메모리가 필요한 것이냐는 질문입니다.
위 질문 중간에 댓글에 나온
https://stackoverflow.com/questions/15024443/allowed-memory-size-exhausted
위 글이 답변일수도 있겠습니다. zip파일은 10MB이지만 풀면 300MB도 될수 있으니 에러나 날 수 있답니다.
그리하여 대망의 답변
번역된 답변입니다.
이미지는 원래 압축하지 않으면 픽셀당 4바이트(32비트)를 차지하는데, 올린 이미지의 크기를 픽셀당 4바이트로 계산하면 12MB이미지가 되는거고 이게 용량 부족을 초래하였다. 입니다.
이미지 압축을 왜 안하냐면, 안했다기 보다는 이미지를 올리고 '풀어서' 확인후 다시 리사이징을 해야 하는데, 이 푸는 과정에서 메모리가 많이 필요한거죠. 압축 안한 이미지를 봐야 하니까요.
제가 테스트한 이미지가 5.9MB였고 4624*3468픽셀의 이미지 였으니 저는 더 많은 메모리가 필요한것이죠.
메모리 누수라고 생각할수도 있습니다.
결론적으로 위와 같이 256MB로 수정하고 정상적으로 업로드를 하였습니다.
이미지 변환 함수가 얼마나 사용되느냐에 따라 메모리는 더 필요할수 있습니다.
그나저나 이런 작업이 서버에 갑자기 많이 들어오면 장애나는건 일도 아니겠다 싶습니다.
그리고 이런거 나올때마다 해주고 싶은 이야기
제발;;;
ini_set("memory_limit", -1);
위와 같이 무제한으로 주지 마세요.
갑자기 서버 죽습니다.
저게 무슨 전가의 보도처럼 되어 버려서 아무데나 휘두르는데, 대부분 그러한 답변 밑에 그러지 말라고 되어 있습니다.
물론 심각한 장애상황이거나 서버의 모든 자원을 끌어서 처리해야 하는 일들(관리자 화면에 가끔 그런게 있죠)은 잠깐 설정을 바꾸어서 사용 할 수 있겠지만, 일반적으로 그러면 안되는겁니다.
이미지 변환은 제가 잘 모르는 부분이라 그런지 늘 새로운 것들이 나옵니다.
졸립지만 재밌습니다.