XE는 용량이 큰 이미지의 섬네일을 생성하기 전에 memory_limit을 체크하는 지능적인 면이 있습니다. 그래서 정상적인 서버에서는 첨부이미지의 섬네일을 생성하다가 메모리 초과로 뻗어버리는 일은 거의 없어요.

 

그런데 외부 이미지는 얘기가 다릅니다. 외부 이미지를 넣어서 글을 쓰면 FileHandler::getRemoteResource() 또는 FileHandler::getRemoteFile() 함수를 사용해서 서버로 다운받은 후 섬네일을 만드는데, 이 함수는 파일 전체를 변수에 담았다가 한꺼번에 디스크에 기록하는 못된 습성이 있습니다. 60MB짜리 짤방을 넣으면 60MB짜리 변수가 만들어져 버리는 겁니다. 게다가 이 변수를 파일에 저장하기 위해 한 번 더 복사하게 되니 실제 메모리 소비량은 120MB가 됩니다. 대부분의 서버는 memory_limit이 128MB 내외이고, XE를 실행하고 DB에서 이런저런 정보를 불러오는 데도 기본적으로 몇십 MB의 메모리가 필요하니, 메모리 초과로 뻗어버리기 딱 좋은 겁니다.

 

게다가 https://github.com/xpressengine/xe-core/pull/1709 이슈가 아직 반영되지 않았기 때문에 한 번 실패하면 포기하는 게 아니라, 문제의 글이 메인화면에 올라와 있으면 새로고침할 때마다 섬네일 생성을 시도하게 됩니다.

 

XE 코어: 모든 버전

 

재현 방법:

- 섬네일 생성 기능이 있는 위젯을 메인화면에 배치한다.

- 새 글을 쓰면서 파일을 첨부하지 않고, 외부 이미지로 아주 용량이 큰 GIF 짤방을 올린다. (대략 60MB 이상)

- 메인화면을 방문하면 한참 기다리다가 메모리 초과로 Fatal Error가 발생한다.

- 문제의 글을 지우거나 다른 글에 밀려서 메인화면에서 내려갈 때까지 같은 현상이 계속 일어난다.

 

해결책:

- 패치: https://github.com/xpressengine/xe-core/pull/1930

- 라이믹스에서는 다른 라이브러리를 사용하여 디스크에 직접 기록하므로 문제가 발생하지 않습니다.
 

TAG •

기진곰

profile
GitHub @kijin 사람을 위한 인터넷 생태계의 발전에 많은 관심을 갖고 있습니다.
우리가 만들어 가는 XE의 새 이름, 라이믹스(Rhymix) 프로젝트에 참여하고 있습니다.
오픈소스 도로명주소 검색서버 및 API Postcodify를 개발, 운영중입니다.
국내외 서버 및 클라우드서버 세팅, 이전, 튜닝해 드립니다.
  • profile

    결론은 라이믹스는 걱정 안해도 된다는 거군요!

     

    라이믹스 만쉐..!

  • profile
    헐... 이거 고쳐지면 혹시 그 특유의 무거운 로딩 느낌이 사라지는건가요?
    getRemoteFile 로 캐시 파일도 읽어 들이는거 맞죠???
  • profile profile
    캐시파일은 remote가 아니라 local입니다.