개발 Q&A

제목 이미지가 깨지는 문제
글쓴이 코딩악동 작성시각 2013/07/19 13:36:08
댓글 : 8 추천 : 0 스크랩 : 0 조회수 : 18643   RSS
프로세스 과정은 html페이지에서 조건을 받아 select쿼리를 날려
DB에서 데이터를 가져와 GD라이브러리를 이용해 이미지를 재구성합니다.

조회한 데이터를 이용해 바탕 이미지에 새로운 이미지들을 덧입히는 과정이구요.
DB에서 select해온 데이터가 많으면 시간이 조금 더 걸리지만 그래봐야 1~5초 이내로 연산은 끝납니다.

GD를 통해 이미지를 만드는 연산 부분이 html안에 include 되어 있고,
GD를 통해 만들어진 완성 이미지를 서버에 파일로 떨구고
이것을 html 하단부에서 echo로 img 태그를 보여줍니다.

img 태그의 소스로 불러오는 파일은 png파일입니다.

파일이 이미 존재할 경우(조회했던 걸 다시 조회할 경우)
그냥 파일을 읽어오고 GD연산은 건너뛰고 첫 조회일때만 GD로 이미지를 연산해서 파일로 떨굽니다.


문제 현상은 파일이 존재하지 않을 때, 
즉, 이미지를 새로 만들 때 데이터량이 많거나 서버가 버벅이면
랜덤하게 한번씩(안깨질땐 1000번을 조회해도 안깨집니다;) 그림이 나오다 마는 상태로 깨져서 나옵니다.

처음엔 GD에서 파일을 떨구기 전에 html에서 불러와서 그런거라 생각하기도 해서
실제 파일이 존재하는지 체크하는 file_exists와 생성되는 평균 크기를 체크하도록 filessize 함수를 통해
유효성 검사를 거치게 했는데도 가끔 랜덤하게 깨져나오는 현상이 있습니다.

더 애매한건 깨져서 로딩된 이미지는 실제 파일을 확인해보면 멀쩡한 상태입니다.
때문에 다시 같은 조건으로 조회하면 정상적인 이미지가 나타납니다.

말씀드렸듯이 서버 상태가 좋을 때는 천번을 넘게 신규이미지를 생성하고 조회해도 이런 현상이 안나타나는데
서버에 오가는 작업이 많아 좀 느릴때 한번씩 나타나니까
완벽하게 해결된 것도 아니고 해결이 안된것도 아닌 찝찝한 상태로 있습니다


이 같은 현상에 대해 아시는 분이나 
GD라이브러리로 이미지를 떨굴 때 완성된 파일이 아니라 일단 파일이 생성된 후 순차적으로 파일 용량이 늘어나는지,
혹은 500kb에 이르는 png 파일이 브라우저에 로드될 때 문제가 있는지 등에 대해 아시는 분

어떠한 답변이라도 좋으니 조언이나 해결 부탁드립니다!
 다음글 회원 DB 구축시 정보를 분리하는게 좋을까요? (4)
 이전글 파일 업로드관련 질문드립니다. (5)

댓글

milosz / 2013/07/19 17:02:39 / 추천 0
 worker를 따로 둬서 이미지 생성을 위한 스레드를 분리하는게 좋을 것 같네요.

http://codeigniter-kr.org/tip/view/1173/page/1/
코딩악동 / 2013/07/19 17:42:56 / 추천 0
그렇죠.. 사실 조회할 수 있는 조건에 맞춰 cron을 돌리고
이미지를 항상 미리 생성해두는 것이 최선이라는 것은 인지하고 있습니다.

그렇다고 해도 무제한의 이미지를 생성해 서버에 보관해둘 순 없으니
(물론 일정 양 이상일 때 시간에 맞춰 마찬가지로 이미지파일들을 정리해줄 수 도 있지만...)
일정 조건의 이미지를 생성해두고 그 외의 조건은 그 때마다 조회해야함은 마찬가지라서요.

결국엔 존재하지 않는 조건을 조회했을 때에는 또 연산이 필요합니다;
그 때 우연히 또 이미지가 깨지는 경우가 발생할 수 있다는 생각에 찝찝해서 계속 붙들고 있게 되네요.
변종원(웅파) / 2013/07/20 08:54:40 / 추천 0
php.ini timeout과 메모리 리밋 문제일 수도 있습니다. 두 값을 늘려보세요
코딩악동 / 2013/07/22 08:42:09 / 추천 0
답변 감사합니다.

timeout은 정확히 어떤 것을 말씀하시는건지 모르겠지만, 
default_socket_timeout = 100
mysql.connect_timeout 과 oci8.persistent_timeout 은 -1로 제한을 걸지 않았습니다.

memory limit은 128M 으로 잡혀있는 상태구요.
각 옵션들은 변경한 것은 아니고 원래 설정이 저 상태였습니다.

소켓 타임아웃 100초 이상의 작업이 이뤄진다고 생각되지 않는데..
다른 문제는 또 뭐가 있을까요?
 
코딩악동 / 2013/07/22 08:44:27 / 추천 0
 아참 max_execution_time 이 30초였습니다만,
그래도 화면 뜰 때까지 30초 이상 걸린적은 없었는데..

여튼 시간이 좀 어중간해서 50초로 늘려봤습니다.
또 테스트 반복하러 가봐야겠네요..

변종원(웅파) / 2013/07/22 09:14:25 / 추천 0
매뉴얼에서 프로파일러 찾아서 켜놓으시면 그 페이지의 실행시간, 메모리 시용량 나옵니다. 시간초과가 없었다면 메모리제한에 걸렸을 확률이 높습니다. 배열 연산 비교 등등 메모리 좀 잡아먹습니다. 전에 작업했던 광고보고서의 경우 512m를 줘도 간당간당한 것도 있었습니다.
코딩악동 / 2013/07/22 11:21:43 / 추천 0
변종원(웅파)// 답변 감사합니다.

프로파일러 설치하고 세팅하는데 시간이 좀 걸렸네요;;
연산 및 페이지 로딩 전체를 체크해본 결과

끽해봐야 10메가 이하 메모리를 사용합니다 ㅠㅠ

이젠 어디서 원인을 찾아야할까요.

휴.. 수천번에 한번씩 나오는 이런 현상에 집착하는 제가 이상한건지 ㅠㅠ 
답답합니다
변종원(웅파) / 2013/07/22 13:17:19 / 추천 0
깨졌을때의 아파치 로그와 서버 로그들 살펴보시면 답이 있을 것 같네요