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
- 라이믹스에서는 다른 라이브러리를 사용하여 디스크에 직접 기록하므로 문제가 발생하지 않습니다.
결론은 라이믹스는 걱정 안해도 된다는 거군요!
라이믹스 만쉐..!