Extra Form
PHP PHP 7.4
CMS Rhymix 2.1

요즘 유료로 날씨 관련 해외 api를 결제해서 이것저것 데이터를 받아오고 있는데

 

XE라이믹스에 캐시라는 좋은기능이 있어서 60분으로 설정해서 잘쓰고는 있습니다.

 

하지만 60분에 한번씩 그 로딩을 겪어야하는 당첨자가 꼭 생길테고

 

지금은 방문자가 적다보니 제가 그 60분 api 로딩에 무조건 당첨되고있어서요.

 

이거 제가 사용자라고 생각해도 속도 느리네 이사이트 하고 도망칠것 같다는 생각이 들어서

 

이걸 db에다 저장해두고 휘발성으로 계속 클론탭 활용해서 30분마다 갱신 시켜주고 

 

db에서 사용자들은 데이터를 받아오게끔 해보려고 합니다.

 

심지어 api를 2개 3개 받아오면 거의 사이트가 멈췄나? 싶을정도더라구요.

 

다른분들은 api 사용할때 어떤방식을 이용하는지 궁금합니다.

 

db에 저장을 해보려고하니 멍청하게도 

 

덮어씌우지 않고 1-10까지 불러오고

 

또 실행시키면 1-10불러온걸

 

11~20으로 다음 행에 저장시켜버리고 있네요.

 

근데 또 생각해보면

 

db에 자료를 덮어씌우는거면 그 찰나의 덮어씌우는 순간에는 방문자가 페이지 에러를 겪는건 아닌가 생각도 들구요. 

 

의견 구해봅니다.

 

감사합니다.

  • Lv9

    사이트에 운영에 전혀 지장이 없어야 한다라면 cron을 사용해보시는 것도 좋습니다.

    정확히 원하는 시간에 api 응답을 받아올 수도 있고, 백그라운드에서 작동하기 때문에 회원에게 지장이 가는 작업도 무리없이 진행할 수 있다는 장점이 있습니다.

    단 하나 단점은 세팅하기가 조금 귀찮다는 점인데, 초기 세팅만 감수하신다면 사이트 운영에 지장 없이 원하는 작업을 원하는 시간마다 작동시킬 수 있습니다.

    저는 미션모듈의 일일퀘스트 초기화나, Hotopay의 정기결제 기능을 구현하는데 Cron을 사용했고요

    Hotopay에서 cron 세팅하는 문서 한번 남겨드릴테니 참고하셔서 만들어보시는 것도 좋아보입니다

     

    https://hotopaydocs.potatosoft.kr/cron

  • Lv9 Lv12
    cron tab 말씀하시는거죠? .sh로 받아오고계실까요?
    저는아예 php 가공한 데이터를 db에 넣어야 하나 생각하고 있었는데

    문서 감사합니다!!
  • Lv12 Lv37
    웹호스팅이 아니라면 ssh 터미널에서도 php를 직접 호출할 수 있습니다.
    굳이 .sh 쉘스크립트로 만들 필요는 없지요.
    라이믹스에도 여러 가지 예제가 포함되어 있으니 참고하세요.
    https://rhymix.org/manual/misc/crontab
  • ? Lv8

    어떤 이유 때문에 꼭 DB 에 저장해야 하는게 아니면
    cron 으로 불러와 캐시에 보관해 사용하는 방식을 많이 쓰죠
    ( DB 보다는 안정성은 조금 떨어지긴하지만 )

    1분 이내 로 cron 돌려야하는게 아니면,  그냥 webcron 쓰셔도 무관합니다.  https://cron-job.org/en/  같은

  • ? Lv8 Lv12
    댓글 감사드립니다.

    대체로 api 받아오면 배열로 쭉 뜨던데 그걸 가공 없이 바로 배열그대로 캐시에 보관하고 그 캐시를 불러와서 데이터를 가공하는 방식을 말씀하신거죠?
    뭔가 저는 가공 후 저장해야될것같다는 생각이 자꾸 드네요 ㅎㅎ
  • Lv12 Lv5
    캐시에 저장하려면 가공해서 저장하는 것이 원칙입니다.
    끄집어내서 다시 가공작업을 한다면 캐시의 의미가 반감하겠지요!
    Rhymix\Framework\Cache::get()으로 바로 사용할 수 있게 해서 저장하면 로딩현상이 안생길 것같습니다.
  • Lv5 Lv12
    아아 감사합니다.

    https://xetown.com/questions/1383389#comment_1383402

    뭔가 이 댓글 활용해서 만들어봐야겠네요.

    저도 외부페이지 불러오는 메뉴로 api 서비스 중이라
    저랑 상황도 비슷하네요.
  • Lv12 Lv9

    다만 캐시는 말 그대로 저장하자 마자 바로 사라질 수도 있는 "저장을 보장하지 않는" 임시 저장수단입니다.

    캐시에 저장한 데이터가 사라진다면 다시 데이터를 받아와야 하는데, 이 경우 원글에 작성해두신 것처럼 일부 방문자가 API 응답이 올때까지 무한정 대기해야하는 상황이 발생할 수도 있습니다.

    아니면 캐시에 데이터가 없을 경우를 대비하여 에러 페이지를 구성해두는 방법도 있겠네요.

    사이트 운영에 꼭 필요한 데이터라면 캐시보다는 DB에 저장해두는것이 안전한 방법일 것 같습니다.

    (테이블을 만들어야 해서 조금은 귀찮긴 하겠지만요 ㅎㅎ)

     

    +) https://xetown.com/tips/1762172

    테이블 만드실때는 이런 것도 이용해보세요~

  • Lv9 Lv12

    리버스님 여러모로 답변 감사합니다.

    그러네요. 이거 캐시 기능 작업하고 곰곰히 생각해봤는데

     

    사실 그냥 캐시 60분으로 켠것과 다를 것도 없겠다 생각이 드네요.

    보니깐 A페이지에서 캐시를 선언 하더라도 다른 페이지에서 저장한 A캐시를 땡겨오는 기능은 불가능한 것 같고

    결국은
    말씀 주신 것처럼 "캐시에 저장한 데이터가 사라진다면 다시 데이터를 받아와야 하는데, 이 경우 원글에 작성해두신 것처럼 일부 방문자가 API 응답이 올때까지 무한정 대기해야하는 상황이 발생" 하겠네요.

    백그라운드에서 DB에 저장하는 것을 사용하지 않으면 어느 누군가는 3~5초 가량의 api 호출 시간을 기다려 줘야하는 셈이되겠네요.

    반대로 사용자에게 공개되는 페이지를 크론탭에 넣어두면. 30분마다 자동으로 읽긴 할텐데 그 30분이되는 찰나의 순간에 다른 유저가 온다면 그것 또한 도루묵이 되겠네요.

    심지어 그 30분에 크론에서 연 php에서 새 api 데이터를 안가져오고
    사용자가 열어서 새 api 데이터 가져오는 경우도 빈번하게 생기게 될꺼같구요.