Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

프로필 이미지 URL에 filemtime을 추가하여 변경시 캐시 갱신 유도 #1816

Merged
3 commits merged into from Jul 26, 2016
Merged

프로필 이미지 URL에 filemtime을 추가하여 변경시 캐시 갱신 유도 #1816

3 commits merged into from Jul 26, 2016

Conversation

kijin
Copy link
Contributor

@kijin kijin commented Dec 14, 2015

회원이 프로필 사진을 새로 업로드하더라도 확장자가 같으면 URL이 동일하기 때문에, 일부러 새로고침을 하지 않으면 갱신되지 않는 문제가 있습니다. 웹서버의 Expires 설정이나 클라우드플레어 등을 사용하여 장기간 캐싱을 유도하는 경우에는 문제가 더 커집니다.

이 패치는 기존의 XE 코어에서 CSS, JS 파일 변경시 URL에 자동으로 filemtime을 추가하여 캐시 갱신을 유도하는 기능을 회원 프로필 사진에도 똑같이 적용하여, 웹서버의 Expires 설정이나 클라우드플레어 등을 사용하는 사이트에서도 회원 프로필 사진이 즉시 업데이트되도록 합니다.

@bjrambo
Copy link
Contributor

bjrambo commented Dec 14, 2015

넘나 멋진 것 1

@bjrambo
Copy link
Contributor

bjrambo commented Dec 15, 2015

@kijin 이미지 마크, 이미지 이름은 애드온
addons/member_extra_info 에서 처리 하는 함수가 다르네요.
해당 부분에서 불러오는이미지도 캐싱처리가 가능하도록 되어있어야 할 것 같습니다.

뭐 근데 없어도 작동엔 무리 없어보이기도 하니.. 큰 문제는 없겟지만요..

@bjrambo
Copy link
Contributor

bjrambo commented Dec 15, 2015

addons/member_extra_info/member_extra_info.lib.php
파일에,

33번째줄부터 이렇게 저는 수정했습니다.

        if(file_exists(_XE_PATH_ . $image_name_file))
        {
            $_tmp->image_name_file = $image_name_file. '?' . date('YmdHis', filemtime(_XE_PATH_ . $image_name_file));
        }
        else
        {
            $image_name_file = '';
        }

        if(file_exists(_XE_PATH_ . $image_mark_file))
        {
            $_tmp->image_mark_file = $image_mark_file. '?' . date('YmdHis', filemtime(_XE_PATH_ . $image_mark_file));
        }
        else
        {
            $image_mark_file = '';
        }

@kijin
Copy link
Contributor Author

kijin commented Dec 15, 2015

@qw5414 님이 알려주신 대로 적용하여 커밋 추가했습니다.

@bjrambo
Copy link
Contributor

bjrambo commented Dec 15, 2015

^^b

@wookho
Copy link

wookho commented Dec 19, 2015

PR모두 적용했는데 이상한 현상이 발생하고 있습니다.
한회원의 두가지형태의 이미지이름이 노출되고 있습니다.

대부분 게시물에서는 아래 형태의 이미지이름이 노출되고 있구요.
https://pomelove.com/xe/files/member_extra_info/image_name/416/726/726416.gif?20151219001953

지금 1개의 게시물에서는 아래의 이미지 이름이 노출됩니다.
https://pomelove.com/xe/files/member_extra_info/image_name/416/726/726416.gif

회원정보에서는
https://pomelove.com/xe/files/member_extra_info/image_name/416/726/726416.gif?20151219001953
위 파일로 보입니다.

FTP로 접속해서 보면 아래의 주소의 파일명을 가진 파일 1개만 있습니다.

두개가 다른 이미지로 보이고 있구요.

클라우드플레어 갱신 애드온을 병행해서 사용하고 있습니다.

@bjrambo
Copy link
Contributor

bjrambo commented Dec 19, 2015

@wookho 해당 URL좀..

@wookho
Copy link

wookho commented Dec 19, 2015

@qw5414 메인 페이지나 혹은 한줄수다에서 보시면되요...
달콤원이라는 닉네임입니다.

@bjrambo
Copy link
Contributor

bjrambo commented Dec 19, 2015

@kijin 글로벌함수에, $_tmp->cached 이 함수에 true 잇으면 저희가 원하던 방식으로 ?날자로 캐싱 해주는데, 아닐경우 아래쪽에서는 원래 있는 .gif으로 끝나고 마네요, 그래서 바로 수정한 유저같은경우 두가지로 보이는 경우 같아요 ( @wookho 참고로 저는늦게 접속해서 달콤원이라는 닉네임이 하나로보였습니다. )

member_extra_info.lib.php 파일에서
https://github.com/kijin/xe-core/blob/fix/profile-image-mtime/addons/member_extra_info/member_extra_info.lib.php#L57
이 줄 아래의 코드를 잘 살펴봐야할 것 같아요.

@wookho
Copy link

wookho commented Dec 19, 2015

@qw5414 한줄수다의 맨마지막 글과 기존글의 이미지이름 파일명이 같나요? 전 다르던데요..... 이미지가 아주 미세하게 차이가 납니다.

저는 새로운 브라우저로 열어보아도 두개가 다르게 보입니다.

@wookho
Copy link

wookho commented Dec 19, 2015

@qw5414 스케치북 게시판의 글 작성자에 나오는 이미지이름도

위 형태로 노출이 되네요.

@bjrambo
Copy link
Contributor

bjrambo commented Dec 19, 2015

@wookho 눈이 안좋아서 .. 보니깐 약간 다르네요,
음 아무래도 하나는 리사이징 된 영상이 보였다는건데, 이 현상 자체는 애초에.. 위에 제가 글로벌 부분의 코드상의 문제라고 답변드릴 수 있는것 같아요.

@wookho
Copy link

wookho commented Dec 19, 2015

제판단에는 지금 회원이 이미지를 두번 올렸던 거 같으데요. 어찌 되었던 이러한 케이스가 발생한다는건 유저 혼돈을 막기 위해 해결은 해야 할 듯 하네요.
아마 지금 같은 파일임에도 다르게 보이는건 날짜가 붙지 않은 파일명의 이미지가 클라우드플레어에측에 캐시되어 있을 듯 합니다.

그리고 날짜가 붙은 파일도 캐시되어 있구요...

저희 본서버에는 어차피 날짜가 붙지 않은 파일도 최신 파일일테니 클라우드플레어 캐시를 잠시 중단하면 이번 것은 해결될 듯 하지만 다음에 또 발생할 듯 합니다. 클라우드 플레어 캐시를 잠시 껐다 켜볼게요.

@wookho
Copy link

wookho commented Dec 19, 2015

@qw5414 예상대로 클라우드플레어 캐시를 끄고 새로고침하여 다시 본서버의 이미지를 불러오게 하니 최신 파일로 갱신이 되었습니다.

하지만 불러오는 주소는 여전히 문제가 있죠

이 pr 자체가 클라우드플레어 뿐 아니라 다른 캐시에도 대응하려고 한거니 클라우드플레어뿐 아니라 사용자에 따라서 브라우저캐시 때문에 동일한 현상이 발행할 것으로 보입니다.

@bjrambo
Copy link
Contributor

bjrambo commented Dec 19, 2015

클라우드플레어의 문제는 전혀 없습니다.
어차피, 갱신에서 문제점인데, 해당 부분의 캐싱이 이루어질때, 글로벌함수로 저장을 하게 됩니다, ($_tmp->cached) 으로요.. 그 함수가 트루로 저장되엇을때, 기존의 이미지를 가져오게 하고, 그게 아닐경우 최신 캐싱되는 형태의 주소로 가져오는 방식을 택해서 그래요. 마찬가지로 해당 밑에 부분에 제가 링크한 부분부터 추가적으로 ?날짜형태가 나타나도록 만들어줘야하는 이슈입니다.

@bjrambo
Copy link
Contributor

bjrambo commented Dec 19, 2015

파일이 같은데, 다른 파일로 나타나는건 백번 캐시부분의 이상 여부가 맞고, 클라우드플레어와는 전혀 무관한 XE내의 캐싱문제점이죠. (애초에, 프로필 사진과 동일하게 작동하게 햇더라면 괜찮앗을텐데 아마 닉네임부분을 지우고 해당 이미지로 대처하게 했어야 하니 애드온으로 제작되었겟지요. 그래서 글로벌 함수를 쓰는거고요..)

@kijin
Copy link
Contributor Author

kijin commented Dec 19, 2015

@qw5414 @wookho 자세한 설명 감사합니다. 지금 확인중입니다.

문제가 발생하는 부분이 위젯 같은데, 혹시 위젯 캐시 문제는 아닌지 살펴볼 필요도 있겠습니다. 만약 $_tmp->cached 문제라면 최초 1회 생성된 주소가 계속 나와야 하는데, 최초 1회는 엉터리로 (mtime 없이) 생성되고 2회째부터는 정상으로 나오는 것이 이상하네요.

@bjrambo
Copy link
Contributor

bjrambo commented Dec 19, 2015

@kijin 위젯포함, 한줄메모 게시판의 nick네임 함수에서도 동일하게 발생하고 있습니다.

@kijin
Copy link
Contributor Author

kijin commented Dec 19, 2015

@qw5414 @wookho 문제의 원인을 찾아서 수정했으니 확인 바랍니다.

@wookho
Copy link

wookho commented Dec 19, 2015

@kijin 감사합니다. 모든 브라우저에서 제대로 다 바로 잡혔습니다.

@bjrambo
Copy link
Contributor

bjrambo commented Dec 19, 2015

@kijin @wookho 흑 ..ㅠㅠ 애드온 부분은 제가 잘모르고 코드만 넣으면 되는 줄 알앗습니다. 그게 다음부터 캐싱되는 형태로 만들어진 구조인지 아닌지 몰라성..ㅠㅠ 이 부분을 기진님께서 수고해주셨네요. ㄷㄷ

@ghost ghost added this to the 1.8.22 milestone Jun 16, 2016
@ghost ghost removed this from the 1.8.22 milestone Jun 29, 2016
@ghost ghost modified the milestones: 1.8.23, 1.8.22 Jun 29, 2016
@ghost ghost merged commit c673934 into xpressengine:develop Jul 26, 2016
@kijin kijin deleted the fix/profile-image-mtime branch August 12, 2016 05:30
This pull request was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants